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; }