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; }
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; }