static int shutdown_socket(DBPROCESS *dbproc) { union { struct sockaddr sa; char data[256]; } u; SOCKLEN_T addrlen; struct stat file_stat; TDS_SYS_SOCKET sockets[2]; TDS_SYS_SOCKET socket = DBIOWDESC(dbproc); if (fstat(socket, &file_stat)) return 0; if ((file_stat.st_mode & S_IFSOCK) != S_IFSOCK) return 0; addrlen = sizeof(u); if (tds_getsockname(socket, &u.sa, &addrlen) < 0 || (u.sa.sa_family != AF_INET && u.sa.sa_family != AF_INET6)) return 0; /* replace socket with a new one */ if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) < 0) return 0; /* substitute socket */ close(socket); dup2(sockets[0], socket); /* close connection */ close(sockets[0]); end_socket = sockets[1]; return 1; }
bool CDBL_Connection::Abort() { int fdr= DBIORDESC(GetDBLibConnection()); int fdw= DBIOWDESC(GetDBLibConnection()); if(fdr >= 0) { close(fdr); } if(fdw != fdr && fdw >= 0) { close(fdw); } if (fdr >= 0 || fdw >= 0) { MarkClosed(); return true; } return false; }