From cf39c23d1476feceba45f12f00584e97236ae939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net> Date: Mon, 18 Nov 1996 15:13:35 -0800 Subject: [PATCH] all calls to open(2) now handles EINTR Rev: src/interpret.c:1.10 Rev: src/modules/files/file.c:1.13 Rev: src/modules/image/font.c:1.7 Rev: src/modules/spider/sharedmem.c:1.5 Rev: src/program.c:1.8 Rev: src/rusage.c:1.3 --- src/interpret.c | 11 ++++++++--- src/modules/files/file.c | 10 ++++------ src/modules/image/font.c | 7 +++++-- src/modules/spider/sharedmem.c | 4 +++- src/program.c | 12 ++++++++---- src/rusage.c | 9 +++------ 6 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/interpret.c b/src/interpret.c index 084ba11401..7b70d411a8 100644 --- a/src/interpret.c +++ b/src/interpret.c @@ -4,7 +4,7 @@ ||| See the files COPYING and DISCLAIMER for more information. \*/ #include "global.h" -RCSID("$Id: interpret.c,v 1.9 1996/11/14 01:24:09 hubbe Exp $"); +RCSID("$Id: interpret.c,v 1.10 1996/11/18 23:12:31 hubbe Exp $"); #include "interpret.h" #include "object.h" #include "program.h" @@ -83,8 +83,13 @@ void init_interpreter() #define MAP_ANONYMOUS 0 if(fd == -1) { - fd=open("/dev/zero",O_RDONLY); - if(fd < 0) fatal("Failed to open /dev/zero.\n"); + while(1) + { + fd=open("/dev/zero",O_RDONLY); + if(fd >= 0) break; + if(errno != EINTR) + fatal("Failed to open /dev/zero.\n"); + } } #endif diff --git a/src/modules/files/file.c b/src/modules/files/file.c index 233680c2f5..31913f3bf5 100644 --- a/src/modules/files/file.c +++ b/src/modules/files/file.c @@ -6,7 +6,7 @@ #define READ_BUFFER 16384 #include "global.h" -RCSID("$Id: file.c,v 1.12 1996/11/16 05:17:11 hubbe Exp $"); +RCSID("$Id: file.c,v 1.13 1996/11/18 23:13:05 hubbe Exp $"); #include "types.h" #include "interpret.h" #include "svalue.h" @@ -491,9 +491,10 @@ static void file_open(INT32 args) if(!( flags & (FILE_READ | FILE_WRITE))) error("Must open file for at least one of read and write.\n"); - retry: THREADS_ALLOW(); - fd=open(str->str,map(flags), 00666); + do { + fd=open(str->str,map(flags), 00666); + } while(fd < 0 && errno == EINTR); THREADS_DISALLOW(); if(!fp->current_object->prog) @@ -507,9 +508,6 @@ static void file_open(INT32 args) } else if(fd < 0) { - if(errno == EINTR) - goto retry; - ERRNO=EBADF; } else diff --git a/src/modules/image/font.c b/src/modules/image/font.c index af8e4ae128..29b12e990a 100644 --- a/src/modules/image/font.c +++ b/src/modules/image/font.c @@ -1,4 +1,4 @@ -/* $Id: font.c,v 1.6 1996/11/14 12:34:57 law Exp $ */ +/* $Id: font.c,v 1.7 1996/11/18 23:13:21 hubbe Exp $ */ #include "global.h" @@ -165,8 +165,11 @@ void font_load(INT32 args) free_font_struct(THIS); THIS=NULL; } + do { + fd = open(sp[-args].u.string->str,O_RDONLY); + } while(fd < 0 && errno == EINTR); - if ( (fd = open(sp[-args].u.string->str,O_RDONLY)) > -1) + if (fd >= 0) { long size; size = file_size(fd); diff --git a/src/modules/spider/sharedmem.c b/src/modules/spider/sharedmem.c index 0ec9f24f89..2184b9baf5 100644 --- a/src/modules/spider/sharedmem.c +++ b/src/modules/spider/sharedmem.c @@ -60,7 +60,9 @@ static void new_shared_chunk(int len) sprintf(fname, "/tmp/.spinnerlock_%d", (int)getuid()); unlink(fname); - fd = open(fname, O_RDWR|O_CREAT, 0777); + do { + fd = open(fname, O_RDWR|O_CREAT, 0777); + } while(fd < 0 && errno == EINTR); unlink(fname); lseek(fd, len, SEEK_SET); diff --git a/src/program.c b/src/program.c index 20b88befcf..a55a05ced2 100644 --- a/src/program.c +++ b/src/program.c @@ -4,7 +4,7 @@ ||| See the files COPYING and DISCLAIMER for more information. \*/ #include "global.h" -RCSID("$Id: program.c,v 1.7 1996/11/16 05:17:10 hubbe Exp $"); +RCSID("$Id: program.c,v 1.8 1996/11/18 23:12:32 hubbe Exp $"); #include "program.h" #include "object.h" #include "dynamic_buffer.h" @@ -1292,9 +1292,13 @@ struct program *compile_file(struct pike_string *file_name) int fd; struct program *p; - fd=open(file_name->str,O_RDONLY); - if(fd < 0) - error("Couldn't open file '%s'.\n",file_name->str); + while(1) + { + fd=open(file_name->str,O_RDONLY); + if(fd >= 0) break; + if(errno != EINTR) + error("Couldn't open file '%s'.\n",file_name->str); + } #define FILE_STATE #define PUSH diff --git a/src/rusage.c b/src/rusage.c index 01b946f810..225279a046 100644 --- a/src/rusage.c +++ b/src/rusage.c @@ -34,17 +34,14 @@ INT32 *low_rusage() prusage_t pru; prstatus_t prs; - if(proc_fd < 0) + while(proc_fd < 0) { char proc_name[30]; sprintf(proc_name, "/proc/%05ld", (long)getpid()); proc_fd = open(proc_name, O_RDONLY); - if(proc_fd < 0) - { - /* fprintf(stderr, "Couldn't open %s\n", proc_name); */ - return 0; - } + if(proc_fd >= 0) break; + if(errno != EINTR) return 0; } while(ioctl(proc_fd, PIOCUSAGE, &pru) < 0) -- GitLab