int
uORB::DeviceNode::open(struct file *filp)
{
    int ret;

    /* is this a publisher? */
    if (filp->f_oflags == O_WRONLY) {

        /* become the publisher if we can */
        lock();

        if (_publisher == 0) {
            _publisher = getpid();
            ret = OK;

        } else {
            ret = -EBUSY;
        }

        unlock();

        /* now complete the open */
        if (ret == OK) {
            ret = CDev::open(filp);

            /* open failed - not the publisher anymore */
            if (ret != OK) {
                _publisher = 0;
            }
        }

        return ret;
    }

    /* is this a new subscriber? */
    if (filp->f_oflags == O_RDONLY) {

        /* allocate subscriber data */
        SubscriberData *sd = new SubscriberData;

        if (nullptr == sd) {
            return -ENOMEM;
        }

        memset(sd, 0, sizeof(*sd));

        /* default to no pending update */
        sd->generation = _generation;

        /* set priority */
        sd->set_priority(_priority);

        filp->f_priv = (void *)sd;

        ret = CDev::open(filp);

        add_internal_subscriber();

        if (ret != OK) {
            delete sd;
        }

        return ret;
    }

    /* can only be pub or sub, not both */
    return -EINVAL;
}
int
uORB::DeviceNode::open(device::file_t *filp)
{
	int ret;

	/* is this a publisher? */
	if (filp->flags == PX4_F_WRONLY) {

		/* become the publisher if we can */
		lock();

		if (_publisher == 0) {
			_publisher = px4_getpid();
			ret = PX4_OK;

		} else {
			ret = -EBUSY;
		}

		unlock();

		/* now complete the open */
		if (ret == PX4_OK) {
			ret = VDev::open(filp);

			/* open failed - not the publisher anymore */
			if (ret != PX4_OK) {
				_publisher = 0;
			}
		}

		return ret;
	}

	/* is this a new subscriber? */
	if (filp->flags == PX4_F_RDONLY) {

		/* allocate subscriber data */
		SubscriberData *sd = new SubscriberData;

		if (nullptr == sd) {
			return -ENOMEM;
		}

		memset(sd, 0, sizeof(*sd));

		/* default to no pending update */
		sd->generation = _generation;

		/* set priority */
		sd->priority = _priority;

		filp->priv = (void *)sd;

		ret = VDev::open(filp);

		add_internal_subscriber();

		if (ret != PX4_OK) {
			warnx("ERROR: VDev::open failed\n");
			delete sd;
		}

		//warnx("uORB::DeviceNode::Open: fd = %d flags = %d, priv = %p cdev = %p\n", filp->fd, filp->flags, filp->priv, filp->cdev);
		return ret;
	}

	/* can only be pub or sub, not both */
	return -EINVAL;
}
int
uORB::DeviceNode::open(cdev::file_t *filp)
{
	int ret;

	/* is this a publisher? */
	if (FILE_FLAGS(filp) == PX4_F_WRONLY) {

		/* become the publisher if we can */
		lock();

		if (_publisher == 0) {
			_publisher = px4_getpid();
			ret = PX4_OK;

		} else {
			ret = -EBUSY;
		}

		unlock();

		/* now complete the open */
		if (ret == PX4_OK) {
			ret = CDev::open(filp);

			/* open failed - not the publisher anymore */
			if (ret != PX4_OK) {
				_publisher = 0;
			}
		}

		return ret;
	}

	/* is this a new subscriber? */
	if (FILE_FLAGS(filp) == PX4_F_RDONLY) {

		/* allocate subscriber data */
		SubscriberData *sd = new SubscriberData{};

		if (nullptr == sd) {
			return -ENOMEM;
		}

		/* If there were any previous publications, allow the subscriber to read them */
		sd->generation = _generation - (_queue_size < _generation ? _queue_size : _generation);

		/* set priority */
		sd->set_priority(_priority);

		FILE_PRIV(filp) = (void *)sd;

		ret = CDev::open(filp);

		add_internal_subscriber();

		if (ret != PX4_OK) {
			PX4_ERR("CDev::open failed");
			delete sd;
		}

		return ret;
	}

	if (FILE_FLAGS(filp) == 0) {
		return CDev::open(filp);
	}

	/* can only be pub or sub, not both */
	return -EINVAL;
}