You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

48 lines
720 B

#include "socket_close.h"
#include <ccan/noerr/noerr.h>
#include <errno.h>
#include <sys/socket.h>
#include <unistd.h>
/*
Simplified (minus all the error checks):
shutdown(fd, SHUT_WR);
for (;;) {
char unused[64]
sys_res = read(fd, unused, 64);
if (sys_res == 0)
break;
}
close(fd);
*/
bool socket_close(int fd)
{
char unused[64];
int sys_res;
sys_res = shutdown(fd, SHUT_WR);
if (sys_res < 0) {
close_noerr(fd);
return false;
}
for (;;) {
do {
sys_res = read(fd, unused, sizeof(unused));
} while (sys_res < 0 && errno == EINTR);
if (sys_res < 0) {
close_noerr(fd);
return false;
}
if (sys_res == 0)
break;
}
if (close(fd) < 0)
return false;
else
return true;
}