static LWMsgStatus fserv_close_srv( LWMsgCall* call, const LWMsgParams* in, LWMsgParams* out, void* data ) { LWMsgStatus status = LWMSG_STATUS_SUCCESS; LWMsgSession* session = lwmsg_call_get_session(call); FileHandle* handle = NULL; StatusReply* sreply = NULL; LOG("fserv_close() on fd %i for session %p\n", handle->fd, session); /* Get our internal handle from the lwmsg handle */ status = lwmsg_session_get_handle_data( session, (LWMsgHandle*) in->data, (void**)(void*) &handle); if (status) { goto error; } /* Unregister the handle no matter what */ status = lwmsg_session_unregister_handle(session, (LWMsgHandle*) in->data); if (status) { goto error; } if (close(handle->fd) == -1) { sreply = malloc(sizeof(*sreply)); if (!sreply) { status = LWMSG_STATUS_MEMORY; goto error; } sreply->err = errno; out->tag = FSERV_ERROR_RES; out->data = sreply; } else { out->tag = FSERV_VOID_RES; out->data = NULL; } error: return status; }
static NTSTATUS RegSrvIpcUnregisterHandle( LWMsgCall* pCall, PVOID pHandle ) { NTSTATUS status = 0; LWMsgSession* pSession = lwmsg_call_get_session(pCall); status = MAP_LWMSG_ERROR(lwmsg_session_unregister_handle(pSession, pHandle)); BAIL_ON_NT_STATUS(status); error: return status; }
static LWMsgStatus counter_srv_close(LWMsgCall* call, const LWMsgParams* request_msg, LWMsgParams* reply_msg, void* data) { LWMsgStatus status = LWMSG_STATUS_SUCCESS; CounterHandle* handle = request_msg->data; CounterReply* reply = malloc(sizeof(*reply)); LWMsgSession* session = lwmsg_call_get_session(call); pthread_mutex_lock(&handle->lock); reply->counter = handle->counter; pthread_mutex_unlock(&handle->lock); pthread_mutex_destroy(&handle->lock); lwmsg_session_unregister_handle(session, handle); reply_msg->tag = COUNTER_CLOSE_SUCCESS; reply_msg->data = reply; return status; }