tlib9: add mode parameter to opentemp - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit a58a827f2ae0d989102dc4d8c113b9282ef177b3
 (DIR) parent c224dda84efaeb28ce66e59213f3cbfde06735ac
 (HTM) Author: Russ Cox <rsc@swtch.com>
       Date:   Thu, 10 Jul 2008 11:10:10 -0400
       
       lib9: add mode parameter to opentemp
       
       Diffstat:
         M include/libc.h                      |       2 +-
         M man/man3/opentemp.3                 |      10 +++++++---
         M src/cmd/idiff.c                     |      23 ++---------------------
         M src/cmd/page/filter.c               |       2 +-
         M src/cmd/page/page.h                 |       1 -
         M src/cmd/page/util.c                 |       2 +-
         M src/cmd/page/view.c                 |       2 +-
         M src/cmd/vbackup/vbackup.c           |       2 +-
         M src/lib9/opentemp.c                 |      13 +++++++++----
       
       9 files changed, 23 insertions(+), 34 deletions(-)
       ---
 (DIR) diff --git a/include/libc.h b/include/libc.h
       t@@ -391,7 +391,7 @@ extern        int        iounit(int);
        /* extern        double        ldexp(double, int); <math.h> */
        extern        void        p9longjmp(p9jmp_buf, int);
        extern        char*        mktemp(char*);
       -extern        int                opentemp(char*);
       +extern        int                opentemp(char*, int);
        /* extern        double        modf(double, double*); <math.h> */
        extern        void        p9notejmp(void*, p9jmp_buf, int);
        extern        void        perror(const char*);
 (DIR) diff --git a/man/man3/opentemp.3 b/man/man3/opentemp.3
       t@@ -1,13 +1,13 @@
        .TH OPENTEMP 3
        .SH NAME
       -opentemp \- create a uniquely-named file
       +opentemp \- create and open a uniquely-named file
        .SH SYNOPSIS
        .B #include <u.h>
        .br
        .B #include <libc.h>
        .PP
        .B
       -int opentemp(char *template)
       +int opentemp(char *template, int mode)
        .SH DESCRIPTION
        .I Opentemp
        replaces
       t@@ -28,8 +28,12 @@ are tried until the name of a file that does not yet exist
        .IR access (2))
        is generated.
        .I Opentemp
       -then creates the file for reading and writing
       +then opens the file for the given
       +.I mode
        and returns the file descriptor.
       +Most calls should use a mode
       +of
       +.BR ORDWR|ORCLOSE .
        .PP
        If no such name can be generated,
        .I opentemp
 (DIR) diff --git a/src/cmd/idiff.c b/src/cmd/idiff.c
       t@@ -7,14 +7,11 @@
        #include <libc.h>
        #include <bio.h>
        
       -#define opentemp idiffopentemp
       -
        int diffbflag;
        int diffwflag;
        
        void copy(Biobuf*, char*, Biobuf*, char*);
        void idiff(Biobuf*, char*, Biobuf*, char*, Biobuf*, char*, Biobuf*, char*);
       -int opentemp(char*, int, long);
        void rundiff(char*, char*, int);
        
        void
       t@@ -63,9 +60,9 @@ main(int argc, char **argv)
                        sysfatal("open %s: %r", argv[1]);
        
                strcpy(diffout, "/tmp/idiff.XXXXXX");
       -        fd = opentemp(diffout, ORDWR|ORCLOSE, 0);
       +        fd = opentemp(diffout, ORDWR|ORCLOSE);
                strcpy(idiffout, "/tmp/idiff.XXXXXX");
       -        ofd = opentemp(idiffout, ORDWR|ORCLOSE, 0);
       +        ofd = opentemp(idiffout, ORDWR|ORCLOSE);
                rundiff(argv[0], argv[1], fd);
                seek(fd, 0, 0);
                Binit(&bdiff, fd, OREAD);
       t@@ -80,22 +77,6 @@ main(int argc, char **argv)
                exits(nil);
        }
        
       -int
       -opentemp(char *template, int mode, long perm)
       -{
       -        int fd;
       -        Dir d;
       -
       -        fd = mkstemp(template);
       -        if(fd < 0)
       -                sysfatal("could not create temporary file");
       -        nulldir(&d);
       -        d.mode = perm;
       -        dirfwstat(fd, &d);
       -
       -        return fd;
       -}
       -
        void
        rundiff(char *arg1, char *arg2, int outfd)
        {
 (DIR) diff --git a/src/cmd/page/filter.c b/src/cmd/page/filter.c
       t@@ -32,7 +32,7 @@ initfilt(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf, char *type, cha
                        p[1] = open("/dev/null", ORDWR);
                }
        
       -        ofd = opentemp(template);
       +        ofd = opentemp(template, ORDWR|ORCLOSE);
                switch(fork()){
                case -1:
                        fprint(2, "fork fails: %r\n");
 (DIR) diff --git a/src/cmd/page/page.h b/src/cmd/page/page.h
       t@@ -96,7 +96,6 @@ int        min(int, int);
        void        wexits(char*);
        Image*        xallocimage(Display*, Rectangle, ulong, int, ulong);
        int        bell(void*, char*);
       -int        opentemp(char *template);
        Image*        convert(Graphic *g);
        
        extern int stdinfd;
 (DIR) diff --git a/src/cmd/page/util.c b/src/cmd/page/util.c
       t@@ -53,7 +53,7 @@ spooltodisk(uchar *ibuf, int in, char **name)
                char temp[40];
        
                strcpy(temp, "/tmp/pagespoolXXXXXXXXX");
       -        fd = opentemp(temp);
       +        fd = opentemp(temp, ORDWR|ORCLOSE);
                if(name)
                        *name = estrdup(temp);
        
 (DIR) diff --git a/src/cmd/page/view.c b/src/cmd/page/view.c
       t@@ -732,7 +732,7 @@ viewer(Document *dd)
                                }
                                if(showdata(pm)) {
                                        s = estrdup("/tmp/pageplumbXXXXXXX");
       -                                fd = opentemp(s);
       +                                fd = opentemp(s, ORDWR|ORCLOSE);
                                        write(fd, pm->data, pm->ndata);
                                        /* lose fd reference on purpose; the file is open ORCLOSE */
                                } else if(pm->data[0] == '/') {
 (DIR) diff --git a/src/cmd/vbackup/vbackup.c b/src/cmd/vbackup/vbackup.c
       t@@ -260,7 +260,7 @@ threadmain(int argc, char **argv)
                        if(tmpnam == nil)
                                sysfatal("smprint: %r");
                
       -                if((fd = opentemp(tmpnam)) < 0)
       +                if((fd = opentemp(tmpnam, ORDWR|ORCLOSE)) < 0)
                                sysfatal("opentemp %s: %r", tmpnam);
                        if(statustime)
                                print("# %T reading scores into %s\n", tmpnam);
 (DIR) diff --git a/src/lib9/opentemp.c b/src/lib9/opentemp.c
       t@@ -2,14 +2,19 @@
        #include <libc.h>
        
        int
       -opentemp(char *template)
       +opentemp(char *template, int mode)
        {
       -        int fd;
       +        int fd, fd1;
        
                fd = mkstemp(template);
                if(fd < 0)
                        return -1;
       -        remove(template);
       -        return fd;
       +        if((fd1 = open(template, mode)) < 0){
       +                remove(template);
       +                close(fd);
       +                return -1;
       +        }
       +        close(fd);
       +        return fd1;
        }