Commit aeb30be60a92148e38d47f79b6f566a47a8a6cbd
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
vl.c
| @@ -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 |