Commit aeb30be60a92148e38d47f79b6f566a47a8a6cbd

Authored by balrog
1 parent 6d8aa3bf

Retry interrupted open() calls (proposed by Yigael Felishman).

Linux open(2) doesn't list EINTR, but FreeBSD's open(2) does.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3043 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 24 additions and 18 deletions
@@ -204,6 +204,8 @@ unsigned int nb_prom_envs = 0; @@ -204,6 +204,8 @@ unsigned int nb_prom_envs = 0;
204 const char *prom_envs[MAX_PROM_ENVS]; 204 const char *prom_envs[MAX_PROM_ENVS];
205 #endif 205 #endif
206 206
  207 +#define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR)
  208 +
207 /***********************************************************/ 209 /***********************************************************/
208 /* x86 ISA bus support */ 210 /* x86 ISA bus support */
209 211
@@ -1029,7 +1031,7 @@ static int rtc_fd; @@ -1029,7 +1031,7 @@ static int rtc_fd;
1029 1031
1030 static int start_rtc_timer(void) 1032 static int start_rtc_timer(void)
1031 { 1033 {
1032 - rtc_fd = open("/dev/rtc", O_RDONLY); 1034 + TFR(rtc_fd = open("/dev/rtc", O_RDONLY));
1033 if (rtc_fd < 0) 1035 if (rtc_fd < 0)
1034 return -1; 1036 return -1;
1035 if (ioctl(rtc_fd, RTC_IRQP_SET, RTC_FREQ) < 0) { 1037 if (ioctl(rtc_fd, RTC_IRQP_SET, RTC_FREQ) < 0) {
@@ -1640,7 +1642,7 @@ static CharDriverState *qemu_chr_open_file_out(const char *file_out) @@ -1640,7 +1642,7 @@ static CharDriverState *qemu_chr_open_file_out(const char *file_out)
1640 { 1642 {
1641 int fd_out; 1643 int fd_out;
1642 1644
1643 - fd_out = open(file_out, O_WRONLY | O_TRUNC | O_CREAT | O_BINARY, 0666); 1645 + TFR(fd_out = open(file_out, O_WRONLY | O_TRUNC | O_CREAT | O_BINARY, 0666));
1644 if (fd_out < 0) 1646 if (fd_out < 0)
1645 return NULL; 1647 return NULL;
1646 return qemu_chr_open_fd(-1, fd_out); 1648 return qemu_chr_open_fd(-1, fd_out);
@@ -1653,14 +1655,14 @@ static CharDriverState *qemu_chr_open_pipe(const char *filename) @@ -1653,14 +1655,14 @@ static CharDriverState *qemu_chr_open_pipe(const char *filename)
1653 1655
1654 snprintf(filename_in, 256, "%s.in", filename); 1656 snprintf(filename_in, 256, "%s.in", filename);
1655 snprintf(filename_out, 256, "%s.out", filename); 1657 snprintf(filename_out, 256, "%s.out", filename);
1656 - fd_in = open(filename_in, O_RDWR | O_BINARY);  
1657 - fd_out = open(filename_out, O_RDWR | O_BINARY); 1658 + TFR(fd_in = open(filename_in, O_RDWR | O_BINARY));
  1659 + TFR(fd_out = open(filename_out, O_RDWR | O_BINARY));
1658 if (fd_in < 0 || fd_out < 0) { 1660 if (fd_in < 0 || fd_out < 0) {
1659 if (fd_in >= 0) 1661 if (fd_in >= 0)
1660 close(fd_in); 1662 close(fd_in);
1661 if (fd_out >= 0) 1663 if (fd_out >= 0)
1662 close(fd_out); 1664 close(fd_out);
1663 - fd_in = fd_out = open(filename, O_RDWR | O_BINARY); 1665 + TFR(fd_in = fd_out = open(filename, O_RDWR | O_BINARY));
1664 if (fd_in < 0) 1666 if (fd_in < 0)
1665 return NULL; 1667 return NULL;
1666 } 1668 }
@@ -1911,14 +1913,14 @@ static CharDriverState *qemu_chr_open_tty(const char *filename) @@ -1911,14 +1913,14 @@ static CharDriverState *qemu_chr_open_tty(const char *filename)
1911 CharDriverState *chr; 1913 CharDriverState *chr;
1912 int fd; 1914 int fd;
1913 1915
1914 - fd = open(filename, O_RDWR | O_NONBLOCK);  
1915 - if (fd < 0)  
1916 - return NULL; 1916 + TFR(fd = open(filename, O_RDWR | O_NONBLOCK));
1917 fcntl(fd, F_SETFL, O_NONBLOCK); 1917 fcntl(fd, F_SETFL, O_NONBLOCK);
1918 tty_serial_init(fd, 115200, 'N', 8, 1); 1918 tty_serial_init(fd, 115200, 'N', 8, 1);
1919 chr = qemu_chr_open_fd(fd, fd); 1919 chr = qemu_chr_open_fd(fd, fd);
1920 - if (!chr) 1920 + if (!chr) {
  1921 + close(fd);
1921 return NULL; 1922 return NULL;
  1923 + }
1922 chr->chr_ioctl = tty_serial_ioctl; 1924 chr->chr_ioctl = tty_serial_ioctl;
1923 qemu_chr_reset(chr); 1925 qemu_chr_reset(chr);
1924 return chr; 1926 return chr;
@@ -2041,7 +2043,7 @@ static CharDriverState *qemu_chr_open_pp(const char *filename) @@ -2041,7 +2043,7 @@ static CharDriverState *qemu_chr_open_pp(const char *filename)
2041 ParallelCharDriver *drv; 2043 ParallelCharDriver *drv;
2042 int fd; 2044 int fd;
2043 2045
2044 - fd = open(filename, O_RDWR); 2046 + TFR(fd = open(filename, O_RDWR));
2045 if (fd < 0) 2047 if (fd < 0)
2046 return NULL; 2048 return NULL;
2047 2049
@@ -3463,7 +3465,7 @@ static int tap_open(char *ifname, int ifname_size) @@ -3463,7 +3465,7 @@ static int tap_open(char *ifname, int ifname_size)
3463 char *dev; 3465 char *dev;
3464 struct stat s; 3466 struct stat s;
3465 3467
3466 - fd = open("/dev/tap", O_RDWR); 3468 + TFR(fd = open("/dev/tap", O_RDWR));
3467 if (fd < 0) { 3469 if (fd < 0) {
3468 fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n"); 3470 fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
3469 return -1; 3471 return -1;
@@ -3507,12 +3509,14 @@ int tap_alloc(char *dev) @@ -3507,12 +3509,14 @@ int tap_alloc(char *dev)
3507 if( ip_fd ) 3509 if( ip_fd )
3508 close(ip_fd); 3510 close(ip_fd);
3509 3511
3510 - if( (ip_fd = open("/dev/udp", O_RDWR, 0)) < 0){ 3512 + TFR(ip_fd = open("/dev/udp", O_RDWR, 0));
  3513 + if (ip_fd < 0) {
3511 syslog(LOG_ERR, "Can't open /dev/ip (actually /dev/udp)"); 3514 syslog(LOG_ERR, "Can't open /dev/ip (actually /dev/udp)");
3512 return -1; 3515 return -1;
3513 } 3516 }
3514 3517
3515 - if( (tap_fd = open("/dev/tap", O_RDWR, 0)) < 0){ 3518 + TFR(tap_fd = open("/dev/tap", O_RDWR, 0));
  3519 + if (tap_fd < 0) {
3516 syslog(LOG_ERR, "Can't open /dev/tap"); 3520 syslog(LOG_ERR, "Can't open /dev/tap");
3517 return -1; 3521 return -1;
3518 } 3522 }
@@ -3525,7 +3529,8 @@ int tap_alloc(char *dev) @@ -3525,7 +3529,8 @@ int tap_alloc(char *dev)
3525 if ((ppa = ioctl (tap_fd, I_STR, &strioc_ppa)) < 0) 3529 if ((ppa = ioctl (tap_fd, I_STR, &strioc_ppa)) < 0)
3526 syslog (LOG_ERR, "Can't assign new interface"); 3530 syslog (LOG_ERR, "Can't assign new interface");
3527 3531
3528 - if( (if_fd = open("/dev/tap", O_RDWR, 0)) < 0){ 3532 + TFR(if_fd = open("/dev/tap", O_RDWR, 0));
  3533 + if (if_fd < 0) {
3529 syslog(LOG_ERR, "Can't open /dev/tap (2)"); 3534 syslog(LOG_ERR, "Can't open /dev/tap (2)");
3530 return -1; 3535 return -1;
3531 } 3536 }
@@ -3557,7 +3562,8 @@ int tap_alloc(char *dev) @@ -3557,7 +3562,8 @@ int tap_alloc(char *dev)
3557 if (ioctl (ip_fd, I_PUSH, "arp") < 0) 3562 if (ioctl (ip_fd, I_PUSH, "arp") < 0)
3558 syslog (LOG_ERR, "Can't push ARP module (3)\n"); 3563 syslog (LOG_ERR, "Can't push ARP module (3)\n");
3559 /* Open arp_fd */ 3564 /* Open arp_fd */
3560 - if ((arp_fd = open ("/dev/tap", O_RDWR, 0)) < 0) 3565 + TFR(arp_fd = open ("/dev/tap", O_RDWR, 0));
  3566 + if (arp_fd < 0)
3561 syslog (LOG_ERR, "Can't open %s\n", "/dev/tap"); 3567 syslog (LOG_ERR, "Can't open %s\n", "/dev/tap");
3562 3568
3563 /* Set ifname to arp */ 3569 /* Set ifname to arp */
@@ -3613,7 +3619,7 @@ static int tap_open(char *ifname, int ifname_size) @@ -3613,7 +3619,7 @@ static int tap_open(char *ifname, int ifname_size)
3613 struct ifreq ifr; 3619 struct ifreq ifr;
3614 int fd, ret; 3620 int fd, ret;
3615 3621
3616 - fd = open("/dev/net/tun", O_RDWR); 3622 + TFR(fd = open("/dev/net/tun", O_RDWR));
3617 if (fd < 0) { 3623 if (fd < 0) {
3618 fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n"); 3624 fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
3619 return -1; 3625 return -1;
@@ -3649,7 +3655,7 @@ static int net_tap_init(VLANState *vlan, const char *ifname1, @@ -3649,7 +3655,7 @@ static int net_tap_init(VLANState *vlan, const char *ifname1,
3649 pstrcpy(ifname, sizeof(ifname), ifname1); 3655 pstrcpy(ifname, sizeof(ifname), ifname1);
3650 else 3656 else
3651 ifname[0] = '\0'; 3657 ifname[0] = '\0';
3652 - fd = tap_open(ifname, sizeof(ifname)); 3658 + TFR(fd = tap_open(ifname, sizeof(ifname)));
3653 if (fd < 0) 3659 if (fd < 0)
3654 return -1; 3660 return -1;
3655 3661
@@ -8038,7 +8044,7 @@ int main(int argc, char **argv) @@ -8038,7 +8044,7 @@ int main(int argc, char **argv)
8038 if (len != 1) 8044 if (len != 1)
8039 exit(1); 8045 exit(1);
8040 8046
8041 - fd = open("/dev/null", O_RDWR); 8047 + TFR(fd = open("/dev/null", O_RDWR));
8042 if (fd == -1) 8048 if (fd == -1)
8043 exit(1); 8049 exit(1);
8044 8050