コード例 #1
0
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
}
コード例 #2
0
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;
}