# include # include # include # include int mktmp(char name[], int oflags, int perms) { int fd; if (sprintf(name, "/tmp/%s%lu", getenv("LOGNAME"),getpid()) <= 0) return -1; if( (fd = open(name,oflags,perms)) < 0) { perror("open"); return -1; } unlink(name); return fd ; } int main(){ char tmpfile[256]; char buffer[80]; int nr, nw, fd, length; length = 0; if( (fd = mktmp(tmpfile, O_RDWR | O_CREAT, 0660 ) ) < 0) exit(1); /* read from stdin to tmpfile: */ while( (nr = read(0,buffer,80)) > 0 ) if( (nw = write(fd,buffer,nr) ) < nr) { perror("write"); exit(1); } else length += nw; if( lseek(fd,0,SEEK_SET) < 0) { perror("lseek"); exit(3); } /* read from tmpfile to stderr: */ while( (nr = read(fd,buffer,80)) > 0 ) if( (nw = write(2,buffer,nr) ) < nr) { perror("write"); exit(4); } /* fill buffer with zero's: */ for(nw=0; nw < 80; nw++) buffer[nw] = '0'; /* now overwrite tmpfile: */ if( lseek(fd,0,SEEK_SET) < 0) { perror("lseek"); exit(5); } while( (length >= 80 ) && ( (nw = write(fd,buffer,80)) >0) ) length -=nw; if(write(fd,buffer,length) < 0) { perror("write"); exit(6); } close(fd); exit(0); }