static void request_send_nowait(struct fuse_conn *fc, struct fuse_req *req) { spin_lock(&fc->lock); if (fc->connected) { req->background = 1; fc->num_background++; if (fc->num_background == FUSE_MAX_BACKGROUND) fc->blocked = 1; queue_request(fc, req); spin_unlock(&fc->lock); } else { req->out.h.error = -ENOTCONN; request_end(fc, req); } }
/* AUDIT[securityd](done): reply (checked by mig) is a caller provided mach_port. request_id (checked by mig) is caller provided value, that matches the mig entry for the server function. */ kern_return_t securityd_server_send_reply(mach_port_t reply, uint32_t request_id, OSStatus status, CFTypeRef args_out) { CFDataRef data_out = NULL; if (args_out) { #ifndef NDEBUG CFDataRef query_debug = CFPropertyListCreateXMLData(kCFAllocatorDefault, args_out); secdebug("client", "securityd response: %.*s\n", CFDataGetLength(query_debug), CFDataGetBytePtr(query_debug)); CFReleaseSafe(query_debug); #endif CFErrorRef error = NULL; data_out = CFPropertyListCreateData(kCFAllocatorDefault, args_out, kCFPropertyListBinaryFormat_v1_0, 0, &error); CFRelease(args_out); if (error) { secdebug("server", "failed to encode return data: %@", error); CFReleaseSafe(error); } } void *p = (data_out ? (void *)CFDataGetBytePtr(data_out) : NULL); CFIndex l = (data_out ? CFDataGetLength(data_out) : 0); /* 64 bits cast: securityd should never generate replies bigger than 2^32 bytes. Worst case is we are truncating the reply we send to the client. This would only cause the client side to not be able to decode the response. */ assert((unsigned long)l<UINT_MAX); /* Debug check */ kern_return_t err = securityd_client_reply(reply, request_id, status, p, (unsigned int)l); CFReleaseSafe(data_out); request_end(); return err; }