PIPE_HANDLE clNamedPipeConnectionsServer::initNewInstance() { #ifdef __WXMSW__ PACL acl; SECURITY_DESCRIPTOR sd = {0}; SECURITY_ATTRIBUTES sa = {0}; memset(&sa, 0, sizeof(sa)); sa.nLength = sizeof(sa); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; HANDLE hPipe = createNamedPipe(_pipePath, sa); if (!hPipe) { this->setLastError(NP_SERVER_UNKNOWN_ERROR); return INVALID_PIPE_HANDLE; } return hPipe; #else if (_listenHandle == INVALID_PIPE_HANDLE) { unlink(_pipePath); struct sockaddr_un server; _listenHandle = socket(AF_UNIX, SOCK_STREAM, 0); if (_listenHandle < 0) { perror("ERROR: socket"); return INVALID_PIPE_HANDLE; } server.sun_family = AF_UNIX; strcpy(server.sun_path, _pipePath); if (bind(_listenHandle, (struct sockaddr *) &server, sizeof(struct sockaddr_un))) { perror("ERROR: binding stream socket"); return INVALID_PIPE_HANDLE; } } listen(_listenHandle, 10); return _listenHandle; #endif }
int PipeControlChannel::start(const bsl::string& pipeName) { BALL_LOG_SET_CATEGORY(LOG_CATEGORY); // BSLS_ASSERT(!d_isRunningFlag); // TBD: DOES createNamedPipe FAIL??? if (d_isRunningFlag) { return 2; // RETURN } #ifdef BSLS_PLATFORM_OS_WINDOWS // See test driver case 9, on windows, createNamedPipe does not // fail if the named pipe is already open!!!!! // TBD if (d_isPipeOpen) { return 3; } #endif if (0 != createNamedPipe(pipeName)) { BALL_LOG_ERROR << "Unable to create named pipe '" << pipeName << "'" << BALL_LOG_END; return 1; // RETURN } d_pipeName = pipeName; d_isRunningFlag = d_isPipeOpen = true; int rc = bslmt::ThreadUtil::create( &d_thread, bdlf::BindUtil::bind(&PipeControlChannel::backgroundProcessor, this)); if (rc != 0) { BALL_LOG_ERROR << "Cannot create processing thread, rc = " << rc << BALL_LOG_END; d_isRunningFlag = false; return rc; // RETURN } return 0; }