mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-19 07:04:22 +01:00
47
common/socket_close.c
Normal file
47
common/socket_close.c
Normal file
@@ -0,0 +1,47 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user