void Control_socket_manager::handle_controller() { std::cout << "CONTROL_SOCKET_MANAGER: " << "handle controller hit" << std::endl; if ((num_of_bytes = recv(request_fd, buffer, sizeof buffer, 0)) <= 0) { // got error or connection closed by client if (num_of_bytes == 0) { // connection closed printf("HANDLE_CONTROLLER: controller hung up\n"); } else { perror("recv"); } close(request_fd); router->unregister_fd(request_fd); connections.erase(request_fd); } else { printf("HANDLE_CONTROLLER: Message received was: %s\n", buffer); // handle incoming data Control_message message; Network_services::encode_control_message(&message, buffer); handle_control_message(&message); memset(&buffer, 0, sizeof buffer); } }
void handle_control_socket(int s) { ssize_t nb; ssize_t len = 0; struct lfd_control_message msg; struct sockaddr_un app; socklen_t s_app = sizeof(struct sockaddr_un); int ms = accept(s, (struct sockaddr *)&app, &s_app); if (ms <= 0) return; while (len < sizeof(msg)) { nb = recv(ms, &msg, sizeof(msg), 0); if (nb < 0) { close(ms); return; } len += nb; } handle_control_message(&msg, ms); close(ms); }
/* * Host sent us a control message. * Called in interrupt context! */ static void control_in_intr(struct virtqueue *vq) { struct crypto_device *crdev; struct crypto_vq_buffer *buf; unsigned int len; debug("Entering\n"); crdev = vq->vdev->priv; while ((buf = virtqueue_get_buf(vq, &len))) { buf->len = len; buf->offset = 0; handle_control_message(crdev, buf); spin_lock_irq(&crdev->c_lock); if (add_inbuf(crdev->c_ivq, buf) < 0) { printk(KERN_WARNING "Error adding buffer to queue\n"); free_buf(buf); } spin_unlock_irq(&crdev->c_lock); } debug("Leaving\n"); }
/* * Handler for control c_ovq virtqueue. * Called when guest sends a control message to the host. */ static void control_out(VirtIODevice *vdev, VirtQueue *vq) { VirtQueueElement elem; VirtIOCrypto *crdev; uint8_t *buf; size_t len; FUNC_IN; crdev = DO_UPCAST(VirtIOCrypto, vdev, vdev); len = 0; buf = NULL; if (!virtqueue_pop(vq, &elem)) return ; len = iov_size(elem.out_sg, elem.out_num); buf = g_malloc(len); iov_to_buf(elem.out_sg, elem.out_num, 0, buf, len); handle_control_message(crdev, buf, len); virtqueue_push(vq, &elem, 0); virtio_notify(vdev, vq); g_free(buf); FUNC_OUT; }
void recv(const header_packet& hdr, darc::buffer::shared_buffer data) { assert(hdr.payload_type == header_packet::control); inbound_data<serializer::boost_serializer, control_packet> i_control(data); handle_control_message(i_control.get()); }
void handle_property_set_fd() { prop_msg msg; int s; int r; int res; struct ucred cr; struct sockaddr_un addr; socklen_t addr_size = sizeof(addr); socklen_t cr_size = sizeof(cr); if ((s = accept(property_set_fd, (struct sockaddr *) &addr, &addr_size)) < 0) { return; } /* Check socket options here */ if (getsockopt(s, SOL_SOCKET, SO_PEERCRED, &cr, &cr_size) < 0) { close(s); ERROR("Unable to recieve socket options\n"); return; } r = recv(s, &msg, sizeof(msg), 0); close(s); if(r != sizeof(prop_msg)) { ERROR("sys_prop: mis-match msg size recieved: %d expected: %d\n", r, sizeof(prop_msg)); return; } switch(msg.cmd) { case PROP_MSG_SETPROP: msg.name[PROP_NAME_MAX-1] = 0; msg.value[PROP_VALUE_MAX-1] = 0; if(memcmp(msg.name,"ctl.",4) == 0) { if (check_control_perms(msg.value, cr.uid, cr.gid)) { handle_control_message((char*) msg.name + 4, (char*) msg.value); } else { ERROR("sys_prop: Unable to %s service ctl [%s] uid: %d pid:%d\n", msg.name + 4, msg.value, cr.uid, cr.pid); } } else { if (check_perms(msg.name, cr.uid, cr.gid)) { property_set((char*) msg.name, (char*) msg.value); } else { ERROR("sys_prop: permission denied uid:%d name:%s\n", cr.uid, msg.name); } } break; default: break; } }
void handle_property_set_fd() { prop_msg msg; int s; int r; int res; struct ucred cr; struct sockaddr_un addr; socklen_t addr_size = sizeof(addr); socklen_t cr_size = sizeof(cr); char * source_ctx = NULL; if ((s = accept(property_set_fd, (struct sockaddr *) &addr, &addr_size)) < 0) { return; } /* Check socket options here */ if (getsockopt(s, SOL_SOCKET, SO_PEERCRED, &cr, &cr_size) < 0) { close(s); ERROR("Unable to receive socket options\n"); return; } r = TEMP_FAILURE_RETRY(recv(s, &msg, sizeof(msg), 0)); if(r != sizeof(prop_msg)) { ERROR("sys_prop: mis-match msg size received: %d expected: %zu errno: %d\n", r, sizeof(prop_msg), errno); close(s); return; } switch(msg.cmd) { case PROP_MSG_SETPROP: msg.name[PROP_NAME_MAX-1] = 0; msg.value[PROP_VALUE_MAX-1] = 0; if (!is_legal_property_name(msg.name, strlen(msg.name))) { ERROR("sys_prop: illegal property name. Got: \"%s\"\n", msg.name); close(s); return; } getpeercon(s, &source_ctx); if(memcmp(msg.name,"ctl.",4) == 0) { // Keep the old close-socket-early behavior when handling // ctl.* properties. close(s); if (check_control_perms(msg.value, cr.uid, cr.gid, source_ctx)) { handle_control_message((char*) msg.name + 4, (char*) msg.value); } else { ERROR("sys_prop: Unable to %s service ctl [%s] uid:%d gid:%d pid:%d\n", msg.name + 4, msg.value, cr.uid, cr.gid, cr.pid); } } else { if (check_perms(msg.name, cr.uid, cr.gid, source_ctx)) { property_set((char*) msg.name, (char*) msg.value); } else { ERROR("sys_prop: permission denied uid:%d name:%s\n", cr.uid, msg.name); } // Note: bionic's property client code assumes that the // property server will not close the socket until *AFTER* // the property is written to memory. close(s); } freecon(source_ctx); break; default: close(s); break; } }
static void handle_property_set_fd() { prop_msg msg; int s; int r; struct ucred cr; struct sockaddr_un addr; socklen_t addr_size = sizeof(addr); socklen_t cr_size = sizeof(cr); char * source_ctx = NULL; struct pollfd ufds[1]; const int timeout_ms = 2 * 1000; /* Default 2 sec timeout for caller to send property. */ int nr; if ((s = accept(property_set_fd, (struct sockaddr *) &addr, &addr_size)) < 0) { return; } /* Check socket options here */ if (getsockopt(s, SOL_SOCKET, SO_PEERCRED, &cr, &cr_size) < 0) { close(s); PLOG(ERROR) << "Unable to receive socket options"; return; } ufds[0].fd = s; ufds[0].events = POLLIN; ufds[0].revents = 0; nr = TEMP_FAILURE_RETRY(poll(ufds, 1, timeout_ms)); if (nr == 0) { LOG(ERROR) << "sys_prop: timeout waiting for uid " << cr.uid << " to send property message."; close(s); return; } else if (nr < 0) { PLOG(ERROR) << "sys_prop: error waiting for uid " << cr.uid << " to send property message"; close(s); return; } r = TEMP_FAILURE_RETRY(recv(s, &msg, sizeof(msg), MSG_DONTWAIT)); if(r != sizeof(prop_msg)) { PLOG(ERROR) << "sys_prop: mis-match msg size received: " << r << " expected: " << sizeof(prop_msg); close(s); return; } switch(msg.cmd) { case PROP_MSG_SETPROP: msg.name[PROP_NAME_MAX-1] = 0; msg.value[PROP_VALUE_MAX-1] = 0; if (!is_legal_property_name(msg.name, strlen(msg.name))) { LOG(ERROR) << "sys_prop: illegal property name \"" << msg.name << "\""; close(s); return; } getpeercon(s, &source_ctx); if(memcmp(msg.name,"ctl.",4) == 0) { // Keep the old close-socket-early behavior when handling // ctl.* properties. close(s); if (check_control_mac_perms(msg.value, source_ctx, &cr)) { handle_control_message((char*) msg.name + 4, (char*) msg.value); } else { LOG(ERROR) << "sys_prop: Unable to " << (msg.name + 4) << " service ctl [" << msg.value << "]" << " uid:" << cr.uid << " gid:" << cr.gid << " pid:" << cr.pid; } } else { if (check_mac_perms(msg.name, source_ctx, &cr)) { property_set((char*) msg.name, (char*) msg.value); } else { LOG(ERROR) << "sys_prop: permission denied uid:" << cr.uid << " name:" << msg.name; } // Note: bionic's property client code assumes that the // property server will not close the socket until *AFTER* // the property is written to memory. close(s); } freecon(source_ctx); break; default: close(s); break; } }
void handle_property_set_fd() { prop_msg msg; int s; int r; int res; struct ucred cr; struct sockaddr_un addr; socklen_t addr_size = sizeof(addr); socklen_t cr_size = sizeof(cr); char * source_ctx = NULL; struct pollfd ufds[1]; const int timeout_ms = 2 * 1000; /* Default 2 sec timeout for caller to send property. */ int nr; if ((s = accept(property_set_fd, (struct sockaddr *) &addr, &addr_size)) < 0) { return; } /* Check socket options here */ if (getsockopt(s, SOL_SOCKET, SO_PEERCRED, &cr, &cr_size) < 0) { close(s); ERROR("Unable to receive socket options\n"); return; } ufds[0].fd = s; ufds[0].events = POLLIN; ufds[0].revents = 0; nr = TEMP_FAILURE_RETRY(poll(ufds, 1, timeout_ms)); if (nr == 0) { ERROR("sys_prop: timeout waiting for pid=%d uid=%d gid=%d to send property message.\n", cr.pid, cr.uid, cr.gid); close(s); return; } else if (nr < 0) { ERROR("sys_prop: error waiting for pid=%d uid=%d gid=%d to send property message. err=%d %s\n", cr.pid, cr.uid, cr.gid, errno, strerror(errno)); close(s); return; } r = TEMP_FAILURE_RETRY(recv(s, &msg, sizeof(msg), MSG_DONTWAIT)); if(r != sizeof(prop_msg)) { ERROR("sys_prop: mis-match msg size received: %d from pid=%d uid=%d gid=%d expected: %zu errno: %d\n", r, cr.pid, cr.uid, cr.gid, sizeof(prop_msg), errno); close(s); return; } switch(msg.cmd) { case PROP_MSG_SETPROP: msg.name[PROP_NAME_MAX-1] = 0; msg.value[PROP_VALUE_MAX-1] = 0; if (!is_legal_property_name(msg.name, strlen(msg.name))) { ERROR("sys_prop: illegal property name. Got: \"%s\"\n", msg.name); close(s); return; } getpeercon(s, &source_ctx); if(memcmp(msg.name,"ctl.",4) == 0) { // Keep the old close-socket-early behavior when handling // ctl.* properties. close(s); if (check_control_mac_perms(msg.value, source_ctx)) { #ifdef MTK_INIT INFO("[PropSet]: pid:%u uid:%u gid:%u %s %s\n", cr.pid, cr.uid, cr.gid, msg.name, msg.value); #endif handle_control_message((char*) msg.name + 4, (char*) msg.value); } else { ERROR("sys_prop: Unable to %s service ctl [%s] uid:%d gid:%d pid:%d\n", msg.name + 4, msg.value, cr.uid, cr.gid, cr.pid); } } else { if (check_perms(msg.name, source_ctx)) { #ifdef MTK_INIT INFO("[PropSet]: pid:%u uid:%u gid:%u set %s=%s\n", cr.pid, cr.uid, cr.gid, msg.name, msg.value); if(strcmp(msg.name, ANDROID_RB_PROPERTY) == 0) { INFO("pid %d set %s=%s\n", cr.pid, msg.name, msg.value); reboot_pid(cr.pid); } #endif property_set((char*) msg.name, (char*) msg.value); } else { ERROR("sys_prop: permission denied uid:%d name:%s\n", cr.uid, msg.name); } // Note: bionic's property client code assumes that the // property server will not close the socket until *AFTER* // the property is written to memory. close(s); } freecon(source_ctx); break; default: close(s); break; } }