Exemplo n.º 1
0
SysStatus
SysVMessagesClient::getCallBackOH(ObjectHandle& oh, void*& blockKey)
{
    ProcessID pid;
    SysStatus rc;

    pid = DREFGOBJ(TheProcessRef)->getPID();
    if (pid != callBackOH.pid()) {
	/* either we've never initialized or
	 * this is a fork child and we need
	 * a new call back oh.
	 */
	ProcessID serverPID;
	ObjectHandle serverOH;
	StubSysVMessages::__Get__metaoh(serverOH);
	passertMsg(!serverOH.invalid(), "No SysVMessages server\n");
	serverPID=serverOH.pid();
	/*
	 * make oh to this object for async callback
	 */
	rc = giveAccessByServer(callBackOH, serverPID);
	passertMsg(_SUCCESS(rc), "giveAccessByServer failed %ld\n", rc);
    }
    oh = callBackOH;
    blockKey = (void*)obj;
    return 0;
}
Exemplo n.º 2
0
SysStatus
CreateDevice(ObjectHandle dirOH,
	     const char *name, mode_t mode, unsigned int major,
	     unsigned int minor, ObjectHandle &device,
	     void* &devData)
{
    SysStatus rc = 0;
    const mode_t perm= S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH;
    StubDevFSRemote devStub(StubBaseObj::UNINITIALIZED);
    ObjectHandle serverOH;

    ObjectHandle devfsServer;
    rc = DREFGOBJ(TheTypeMgrRef)->getTypeHdlr(StubDevFSRemote::typeID(),
					      devfsServer);

    _IF_FAILURE_RET(rc);
    CharDevOpenerRef cdoRef;
    CharDevOpener::charDevs->acquireLock();
    if (CharDevOpener::charDevs->locked_find(MKDEV(major,minor),cdoRef)) {
	rc = DREF(cdoRef)->giveAccessSetClientData(serverOH,
						   devfsServer.pid(),
						   MetaObj::controlAccess,
						   MetaObj::none);
    } else {
	rc = CharDevOpener::Create(major, minor, devfsServer.pid(),
				   cdoRef, serverOH);
	CharDevOpener::charDevs->locked_add(MKDEV(major,minor), cdoRef);
    }
    CharDevOpener::charDevs->releaseLock();

    _IF_FAILURE_RET(rc);

    rc = devStub._CreateNode((char*)name, perm, dirOH, serverOH,
			     new_encode_dev(MKDEV(major,minor)), device);

    tassertRC(rc,"device node creation\n");
    return 0;
}