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 204 const char *prom_envs[MAX_PROM_ENVS];
205 205 #endif
206 206  
  207 +#define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR)
  208 +
207 209 /***********************************************************/
208 210 /* x86 ISA bus support */
209 211  
... ... @@ -1029,7 +1031,7 @@ static int rtc_fd;
1029 1031  
1030 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 1035 if (rtc_fd < 0)
1034 1036 return -1;
1035 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 1642 {
1641 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 1646 if (fd_out < 0)
1645 1647 return NULL;
1646 1648 return qemu_chr_open_fd(-1, fd_out);
... ... @@ -1653,14 +1655,14 @@ static CharDriverState *qemu_chr_open_pipe(const char *filename)
1653 1655  
1654 1656 snprintf(filename_in, 256, "%s.in", filename);
1655 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 1660 if (fd_in < 0 || fd_out < 0) {
1659 1661 if (fd_in >= 0)
1660 1662 close(fd_in);
1661 1663 if (fd_out >= 0)
1662 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 1666 if (fd_in < 0)
1665 1667 return NULL;
1666 1668 }
... ... @@ -1911,14 +1913,14 @@ static CharDriverState *qemu_chr_open_tty(const char *filename)
1911 1913 CharDriverState *chr;
1912 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 1917 fcntl(fd, F_SETFL, O_NONBLOCK);
1918 1918 tty_serial_init(fd, 115200, 'N', 8, 1);
1919 1919 chr = qemu_chr_open_fd(fd, fd);
1920   - if (!chr)
  1920 + if (!chr) {
  1921 + close(fd);
1921 1922 return NULL;
  1923 + }
1922 1924 chr->chr_ioctl = tty_serial_ioctl;
1923 1925 qemu_chr_reset(chr);
1924 1926 return chr;
... ... @@ -2041,7 +2043,7 @@ static CharDriverState *qemu_chr_open_pp(const char *filename)
2041 2043 ParallelCharDriver *drv;
2042 2044 int fd;
2043 2045  
2044   - fd = open(filename, O_RDWR);
  2046 + TFR(fd = open(filename, O_RDWR));
2045 2047 if (fd < 0)
2046 2048 return NULL;
2047 2049  
... ... @@ -3463,7 +3465,7 @@ static int tap_open(char *ifname, int ifname_size)
3463 3465 char *dev;
3464 3466 struct stat s;
3465 3467  
3466   - fd = open("/dev/tap", O_RDWR);
  3468 + TFR(fd = open("/dev/tap", O_RDWR));
3467 3469 if (fd < 0) {
3468 3470 fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
3469 3471 return -1;
... ... @@ -3507,12 +3509,14 @@ int tap_alloc(char *dev)
3507 3509 if( ip_fd )
3508 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 3514 syslog(LOG_ERR, "Can't open /dev/ip (actually /dev/udp)");
3512 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 3520 syslog(LOG_ERR, "Can't open /dev/tap");
3517 3521 return -1;
3518 3522 }
... ... @@ -3525,7 +3529,8 @@ int tap_alloc(char *dev)
3525 3529 if ((ppa = ioctl (tap_fd, I_STR, &strioc_ppa)) < 0)
3526 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 3534 syslog(LOG_ERR, "Can't open /dev/tap (2)");
3530 3535 return -1;
3531 3536 }
... ... @@ -3557,7 +3562,8 @@ int tap_alloc(char *dev)
3557 3562 if (ioctl (ip_fd, I_PUSH, "arp") < 0)
3558 3563 syslog (LOG_ERR, "Can't push ARP module (3)\n");
3559 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 3567 syslog (LOG_ERR, "Can't open %s\n", "/dev/tap");
3562 3568  
3563 3569 /* Set ifname to arp */
... ... @@ -3613,7 +3619,7 @@ static int tap_open(char *ifname, int ifname_size)
3613 3619 struct ifreq ifr;
3614 3620 int fd, ret;
3615 3621  
3616   - fd = open("/dev/net/tun", O_RDWR);
  3622 + TFR(fd = open("/dev/net/tun", O_RDWR));
3617 3623 if (fd < 0) {
3618 3624 fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
3619 3625 return -1;
... ... @@ -3649,7 +3655,7 @@ static int net_tap_init(VLANState *vlan, const char *ifname1,
3649 3655 pstrcpy(ifname, sizeof(ifname), ifname1);
3650 3656 else
3651 3657 ifname[0] = '\0';
3652   - fd = tap_open(ifname, sizeof(ifname));
  3658 + TFR(fd = tap_open(ifname, sizeof(ifname)));
3653 3659 if (fd < 0)
3654 3660 return -1;
3655 3661  
... ... @@ -8038,7 +8044,7 @@ int main(int argc, char **argv)
8038 8044 if (len != 1)
8039 8045 exit(1);
8040 8046  
8041   - fd = open("/dev/null", O_RDWR);
  8047 + TFR(fd = open("/dev/null", O_RDWR));
8042 8048 if (fd == -1)
8043 8049 exit(1);
8044 8050  
... ...