void autofs_mount_succeeded(am_node *mp) { autofs_fh_t *fh = mp->am_parent->am_mnt->mf_autofs_fh; struct autofs_pending_mount **pp, *p; /* don't expire the entries -- the kernel will do it for us */ mp->am_flags |= AMF_NOTIMEOUT; pp = &fh->pending_mounts; while (*pp && !STREQ((*pp)->name, mp->am_name)) pp = &(*pp)->next; /* sanity check */ if (*pp == NULL) return; p = *pp; plog(XLOG_INFO, "autofs: mounting %s succeeded", mp->am_path); send_ready(fh->ioctlfd, p->wait_queue_token); XFREE(p->name); *pp = p->next; XFREE(p); }
void autofs_mount_succeeded(am_node *mp) { autofs_fh_t *fh = mp->am_parent->am_autofs_fh; struct autofs_pending_mount **pp, *p; /* * don't expire the entries -- the kernel will do it for us. * * but it won't do autofs filesystems, so we expire them the old * fashioned way instead. */ if (!(mp->am_mnt->mf_flags & MFF_IS_AUTOFS)) mp->am_flags |= AMF_NOTIMEOUT; pp = &fh->pending_mounts; while (*pp && !STREQ((*pp)->name, mp->am_name)) pp = &(*pp)->next; /* sanity check */ if (*pp == NULL) return; p = *pp; plog(XLOG_INFO, "autofs: mounting %s succeeded", mp->am_path); send_ready(fh->ioctlfd, p->wait_queue_token); XFREE(p->name); *pp = p->next; XFREE(p); }
int main(int argc, char **argv) { initiate(argc, argv); /* initialize executor */ #ifndef BASIC socket_setup(); network_socket = socket_connect(); #endif runsys(); /* initialize running system */ if (has_network_socket()) { request_id(); GraphRes = get_graph_res(); graph_setstatus(); if (GraphRes < 0) exit(12); if (remote) send_ready(); } setjmp (contenv); /* set label for continue long jump */ while (TRUE) { /* repeat until exit() is called */ get_internal(); schedule(); /* reschedule current process */ if (ready != 0) { decode(); /* fetch instruction */ execute(); /* and execute it */ } } return 0; } /* end main */
int autofs_umount_succeeded(am_node *mp) { autofs_fh_t *fh = mp->am_parent->am_autofs_fh; struct autofs_pending_umount **pp, *p; pp = &fh->pending_umounts; while (*pp && !STREQ((*pp)->name, mp->am_name)) pp = &(*pp)->next; /* sanity check */ if (*pp == NULL) return -1; p = *pp; plog(XLOG_INFO, "autofs: unmounting %s succeeded", mp->am_path); send_ready(fh->ioctlfd, p->wait_queue_token); XFREE(p->name); *pp = p->next; XFREE(p); return 0; }
void handle_packet(apacket *p, atransport *t) { asocket *s; D("handle_packet() %c%c%c%c\n", ((char*) (&(p->msg.command)))[0], ((char*) (&(p->msg.command)))[1], ((char*) (&(p->msg.command)))[2], ((char*) (&(p->msg.command)))[3]); print_packet("recv", p); switch(p->msg.command){ case A_SYNC: if(p->msg.arg0){ send_packet(p, t); if(HOST) send_connect(t); } else { t->connection_state = CS_OFFLINE; handle_offline(t); send_packet(p, t); } return; case A_CNXN: /* CONNECT(version, maxdata, "system-id-string") */ /* XXX verify version, etc */ if(t->connection_state != CS_OFFLINE) { t->connection_state = CS_OFFLINE; handle_offline(t); } parse_banner((char*) p->data, t); handle_online(); if(!HOST) send_connect(t); break; case A_OPEN: /* OPEN(local-id, 0, "destination") */ if(t->connection_state != CS_OFFLINE) { char *name = (char*) p->data; name[p->msg.data_length > 0 ? p->msg.data_length - 1 : 0] = 0; s = create_local_service_socket(name); if(s == 0) { send_close(0, p->msg.arg0, t); } else { s->peer = create_remote_socket(p->msg.arg0, t); s->peer->peer = s; send_ready(s->id, s->peer->id, t); s->ready(s); } } break; case A_OKAY: /* READY(local-id, remote-id, "") */ if(t->connection_state != CS_OFFLINE) { if((s = find_local_socket(p->msg.arg1))) { if(s->peer == 0) { s->peer = create_remote_socket(p->msg.arg0, t); s->peer->peer = s; } s->ready(s); } } break; case A_CLSE: /* CLOSE(local-id, remote-id, "") */ if(t->connection_state != CS_OFFLINE) { if((s = find_local_socket(p->msg.arg1))) { s->close(s); } } break; case A_WRTE: if(t->connection_state != CS_OFFLINE) { if((s = find_local_socket(p->msg.arg1))) { unsigned rid = p->msg.arg0; p->len = p->msg.data_length; if(s->enqueue(s, p) == 0) { D("Enqueue the socket\n"); send_ready(s->id, rid, t); } return; } } break; default: printf("handle_packet: what is %08x?!\n", p->msg.command); } put_apacket(p); }
int main(int argc, char *argv[ ]) { device_t igb_dev; struct ifreq device; int error; struct sockaddr_ll ifsock_addr; struct packet_mreq mreq; int ifindex; int socket_descriptor; char *iface; seventeen22_header *h1722; long long int frame_sequence = 0; unsigned char frame[MAX_FRAME_SIZE]; int size, length; struct sched_param sched; struct mrp_listener_ctx *ctx = malloc(sizeof(struct mrp_listener_ctx)); struct mrp_domain_attr *class_a = malloc(sizeof(struct mrp_domain_attr)); struct mrp_domain_attr *class_b = malloc(sizeof(struct mrp_domain_attr)); ctx_sig = ctx; int rc; if (argc < 2) { fprintf(stderr, "Usage : %s <interface_name> <payload>\n",argv[0]); return EINVAL; } signal(SIGINT, sigint_handler); #if USE_MRPD rc = mrp_listener_client_init(ctx); if (rc) { printf("failed to initialize global variables\n"); return EXIT_FAILURE; } if (create_socket(ctx)) { fprintf(stderr, "Socket creation failed.\n"); return errno; } rc = mrp_monitor(ctx); if (rc) { printf("failed creating MRP monitor thread\n"); return EXIT_FAILURE; } rc=mrp_get_domain(ctx, class_a, class_b); if (rc) { printf("failed calling mrp_get_domain()\n"); return EXIT_FAILURE; } printf("detected domain Class A PRIO=%d VID=%04x...\n",class_a->priority,class_a->vid); rc = report_domain_status(class_a,ctx); if (rc) { printf("report_domain_status failed\n"); return EXIT_FAILURE; } rc = join_vlan(class_a, ctx); if (rc) { printf("join_vlan failed\n"); return EXIT_FAILURE; } fprintf(stdout,"Waiting for talker...\n"); await_talker(ctx); rc = send_ready(ctx); if (rc) { printf("send_ready failed\n"); return EXIT_FAILURE; } #endif /* USE_MRPD */ iface = strdup(argv[1]); error = pci_connect(&igb_dev); if (error) { fprintf(stderr, "connect failed (%s) - are you running as root?\n", strerror(errno)); return errno; } error = igb_init(&igb_dev); if (error) { fprintf(stderr, "init failed (%s) - is the driver really loaded?\n", strerror(errno)); return errno; } socket_descriptor = socket(AF_PACKET, SOCK_RAW, htons(ETHER_TYPE_AVTP)); if (socket_descriptor < 0) { fprintf(stderr, "failed to open socket: %s \n", strerror(errno)); return EINVAL; } memset(&device, 0, sizeof(device)); memcpy(device.ifr_name, iface, IFNAMSIZ); error = ioctl(socket_descriptor, SIOCGIFINDEX, &device); if (error < 0) { fprintf(stderr, "Failed to get index of iface %s: %s\n", iface, strerror(errno)); return EINVAL; } ifindex = device.ifr_ifindex; memset(&ifsock_addr, 0, sizeof(ifsock_addr)); ifsock_addr.sll_family = AF_PACKET; ifsock_addr.sll_ifindex = ifindex; ifsock_addr.sll_protocol = htons(ETHER_TYPE_AVTP); error = bind(socket_descriptor, (struct sockaddr *) & ifsock_addr, sizeof(ifsock_addr)); if (error < 0) { fprintf(stderr, "Failed to bind: %s\n", strerror(errno)); return EINVAL; } memset(&mreq, 0, sizeof(mreq)); mreq.mr_ifindex = ifindex; mreq.mr_type = PACKET_MR_MULTICAST; mreq.mr_alen = 6; memcpy(mreq.mr_address, glob_dest_addr, mreq.mr_alen); error = setsockopt(socket_descriptor, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); if (error < 0) { fprintf(stderr, "Failed to add multi-cast addresses to port: %u\n", ifindex); return EINVAL; } size = sizeof(ifsock_addr); frame_sequence = 0; memset(frame, 0, sizeof(frame)); memset(&sched, 0, sizeof sched); sched.sched_priority = 1; error = sched_setscheduler(0, SCHED_RR, &sched); if (error < 0) fprintf(stderr, "Failed to select RR scheduler: %s (%d)\n", strerror(errno), errno); while (1) { error = recvfrom(socket_descriptor, frame, MAX_FRAME_SIZE, 0, (struct sockaddr *) &ifsock_addr, (socklen_t *)&size); if (error > 0) { fprintf(stderr,"frame sequence = %lld\n", frame_sequence++); h1722 = (seventeen22_header *)((uint8_t*)frame + sizeof(eth_header)); length = ntohs(h1722->length) - sizeof(six1883_header); write(1, (uint8_t *)((uint8_t*)frame + sizeof(eth_header) + sizeof(seventeen22_header) + sizeof(six1883_header)), length); } else { fprintf(stderr,"recvfrom() error for frame sequence = %lld\n", frame_sequence++); } } usleep(100); close(socket_descriptor); free(ctx); free(class_a); free(class_b); return EXIT_SUCCESS; }
void handle_packet(apacket *p, atransport *t) { asocket *s; D("handle_packet() %c%c%c%c\n", ((char*) (&(p->msg.command)))[0], ((char*) (&(p->msg.command)))[1], ((char*) (&(p->msg.command)))[2], ((char*) (&(p->msg.command)))[3]); print_packet("recv", p); switch(p->msg.command){ case A_SYNC: if(p->msg.arg0){ send_packet(p, t); if(HOST) send_connect(t); } else { t->connection_state = CS_OFFLINE; handle_offline(t); send_packet(p, t); } return; case A_CNXN: /* CONNECT(version, maxdata, "system-id-string") */ /* XXX verify version, etc */ if(t->connection_state != CS_OFFLINE) { t->connection_state = CS_OFFLINE; handle_offline(t); } parse_banner(reinterpret_cast<const char*>(p->data), t); if (HOST || !auth_required) { handle_online(t); if (!HOST) send_connect(t); } else { send_auth_request(t); } break; case A_AUTH: if (p->msg.arg0 == ADB_AUTH_TOKEN) { t->connection_state = CS_UNAUTHORIZED; t->key = adb_auth_nextkey(t->key); if (t->key) { send_auth_response(p->data, p->msg.data_length, t); } else { /* No more private keys to try, send the public key */ send_auth_publickey(t); } } else if (p->msg.arg0 == ADB_AUTH_SIGNATURE) { if (adb_auth_verify(t->token, p->data, p->msg.data_length)) { adb_auth_verified(t); t->failed_auth_attempts = 0; } else { if (t->failed_auth_attempts++ > 10) adb_sleep_ms(1000); send_auth_request(t); } } else if (p->msg.arg0 == ADB_AUTH_RSAPUBLICKEY) { adb_auth_confirm_key(p->data, p->msg.data_length, t); } break; case A_OPEN: /* OPEN(local-id, 0, "destination") */ if (t->online && p->msg.arg0 != 0 && p->msg.arg1 == 0) { char *name = (char*) p->data; name[p->msg.data_length > 0 ? p->msg.data_length - 1 : 0] = 0; s = create_local_service_socket(name); if(s == 0) { send_close(0, p->msg.arg0, t); } else { s->peer = create_remote_socket(p->msg.arg0, t); s->peer->peer = s; send_ready(s->id, s->peer->id, t); s->ready(s); } } break; case A_OKAY: /* READY(local-id, remote-id, "") */ if (t->online && p->msg.arg0 != 0 && p->msg.arg1 != 0) { if((s = find_local_socket(p->msg.arg1, 0))) { if(s->peer == 0) { /* On first READY message, create the connection. */ s->peer = create_remote_socket(p->msg.arg0, t); s->peer->peer = s; s->ready(s); } else if (s->peer->id == p->msg.arg0) { /* Other READY messages must use the same local-id */ s->ready(s); } else { D("Invalid A_OKAY(%d,%d), expected A_OKAY(%d,%d) on transport %s\n", p->msg.arg0, p->msg.arg1, s->peer->id, p->msg.arg1, t->serial); } } } break; case A_CLSE: /* CLOSE(local-id, remote-id, "") or CLOSE(0, remote-id, "") */ if (t->online && p->msg.arg1 != 0) { if((s = find_local_socket(p->msg.arg1, p->msg.arg0))) { /* According to protocol.txt, p->msg.arg0 might be 0 to indicate * a failed OPEN only. However, due to a bug in previous ADB * versions, CLOSE(0, remote-id, "") was also used for normal * CLOSE() operations. * * This is bad because it means a compromised adbd could * send packets to close connections between the host and * other devices. To avoid this, only allow this if the local * socket has a peer on the same transport. */ if (p->msg.arg0 == 0 && s->peer && s->peer->transport != t) { D("Invalid A_CLSE(0, %u) from transport %s, expected transport %s\n", p->msg.arg1, t->serial, s->peer->transport->serial); } else { s->close(s); } } } break; case A_WRTE: /* WRITE(local-id, remote-id, <data>) */ if (t->online && p->msg.arg0 != 0 && p->msg.arg1 != 0) { if((s = find_local_socket(p->msg.arg1, p->msg.arg0))) { unsigned rid = p->msg.arg0; p->len = p->msg.data_length; if(s->enqueue(s, p) == 0) { D("Enqueue the socket\n"); send_ready(s->id, rid, t); } return; } } break; default: printf("handle_packet: what is %08x?!\n", p->msg.command); } put_apacket(p); }
int main(int argc, char *argv[]) { int ret; char* file_name = NULL; char* dev = NULL; char errbuf[PCAP_ERRBUF_SIZE]; struct bpf_program comp_filter_exp; /* The compiled filter expression */ char filter_exp[] = "ether dst 91:E0:F0:00:0e:80"; /* The filter expression */ struct pcap_pkthdr header; /* header pcap gives us */ const u_char* packet; /* actual packet */ signal(SIGINT, sigint_handler); int c; while((c = getopt(argc, argv, "hi:f:")) > 0) { switch (c) { case 'h': help(); break; case 'i': dev = strdup(optarg); break; case 'f': file_name = strdup(optarg); break; default: fprintf(stderr, "Unrecognized option!\n"); } } if ((NULL == dev) || (NULL == file_name)) help(); if (create_socket()) { fprintf(stderr, "Socket creation failed.\n"); return (errno); } report_domain_status(); fprintf(stdout,"Waiting for talker...\n"); await_talker(); #ifdef DEBUG fprintf(stdout,"Send ready-msg...\n"); #endif send_ready(); #ifdef LIBSND SF_INFO* sf_info = (SF_INFO*)malloc(sizeof(SF_INFO)); memset(sf_info, 0, sizeof(SF_INFO)); sf_info->samplerate = SAMPLES_PER_SECOND; sf_info->channels = CHANNELS; sf_info->format = SF_FORMAT_WAV | SF_FORMAT_PCM_24; if (0 == sf_format_check(sf_info)) { fprintf(stderr, "Wrong format."); return -1; } if (NULL == (snd_file = sf_open(file_name, SFM_WRITE, sf_info))) { fprintf(stderr, "Could not create file."); return -1; } fprintf(stdout,"Created file called %s\n", file_name); #endif #ifdef PCAP /** session, get session handler */ /* take promiscuous vs. non-promiscuous sniffing? (0 or 1) */ handle = pcap_open_live(dev, BUFSIZ, 1, -1, errbuf); if (NULL == handle) { fprintf(stderr, "Could not open device %s: %s\n", dev, errbuf); return -1; } #ifdef DEBUG fprintf(stdout,"Got session handler.\n"); #endif /* compile and apply filter */ if (-1 == pcap_compile(handle, &comp_filter_exp, filter_exp, 0, PCAP_NETMASK_UNKNOWN)) { fprintf(stderr, "Could not parse filter %s: %s\n", filter_exp, pcap_geterr(handle)); return -1; } if (-1 == pcap_setfilter(handle, &comp_filter_exp)) { fprintf(stderr, "Could not install filter %s: %s\n", filter_exp, pcap_geterr(handle)); return -1; } #ifdef DEBUG fprintf(stdout,"Compiled and applied filter.\n"); #endif /** loop forever and call callback-function for every received packet */ pcap_loop(handle, -1, pcap_callback, NULL); #endif return 0; }
void handle_packet(apacket *p, atransport *t) { asocket *s; D("handle_packet() %c%c%c%c\n", ((char*) (&(p->msg.command)))[0], ((char*) (&(p->msg.command)))[1], ((char*) (&(p->msg.command)))[2], ((char*) (&(p->msg.command)))[3]); print_packet("recv", p); switch(p->msg.command){ case A_SYNC: if(p->msg.arg0){ send_packet(p, t); if(HOST) send_connect(t); } else { t->connection_state = CS_OFFLINE; handle_offline(t); send_packet(p, t); } return; case A_CNXN: /* CONNECT(version, maxdata, "system-id-string") */ /* XXX verify version, etc */ if(t->connection_state != CS_OFFLINE) { t->connection_state = CS_OFFLINE; handle_offline(t); } parse_banner((char*) p->data, t); if (HOST || !auth_enabled) { handle_online(t); if(!HOST) send_connect(t); } else { #ifndef NO_AUTH send_auth_request(t); #endif } break; #ifndef NO_AUTH case A_AUTH: if (p->msg.arg0 == ADB_AUTH_TOKEN) { t->key = adb_auth_nextkey(t->key); if (t->key) { send_auth_response(p->data, p->msg.data_length, t); } else { /* No more private keys to try, send the public key */ send_auth_publickey(t); } } else if (p->msg.arg0 == ADB_AUTH_SIGNATURE) { if (adb_auth_verify(t->token, p->data, p->msg.data_length)) { adb_auth_verified(t); t->failed_auth_attempts = 0; } else { if (t->failed_auth_attempts++ > 10) adb_sleep_ms(1000); send_auth_request(t); } } else if (p->msg.arg0 == ADB_AUTH_RSAPUBLICKEY) { adb_auth_confirm_key(p->data, p->msg.data_length, t); } break; #endif case A_OPEN: /* OPEN(local-id, 0, "destination") */ if (t->online) { char *name = (char*) p->data; name[p->msg.data_length > 0 ? p->msg.data_length - 1 : 0] = 0; s = create_local_service_socket(name); if(s == 0) { send_close(0, p->msg.arg0, t); } else { s->peer = create_remote_socket(p->msg.arg0, t); s->peer->peer = s; send_ready(s->id, s->peer->id, t); s->ready(s); } } break; case A_OKAY: /* READY(local-id, remote-id, "") */ if (t->online) { if((s = find_local_socket(p->msg.arg1))) { if(s->peer == 0) { s->peer = create_remote_socket(p->msg.arg0, t); s->peer->peer = s; } s->ready(s); } } break; case A_CLSE: /* CLOSE(local-id, remote-id, "") */ if (t->online) { D("CLOSE(%d, %d, \"\")\n", p->msg.arg0, p->msg.arg1); if((s = find_local_socket(p->msg.arg1))) { s->close(s); } } break; case A_WRTE: if (t->online) { if((s = find_local_socket(p->msg.arg1))) { unsigned rid = p->msg.arg0; p->len = p->msg.data_length; if(s->enqueue(s, p) == 0) { D("Enqueue the socket\n"); send_ready(s->id, rid, t); } return; } } break; default: printf("handle_packet: what is %08x?!\n", p->msg.command); } put_apacket(p); }
// adb.c void handle_packet(apacket *p, atransport *t) { D("handle_packet() %c%c%c%c\n", ((char*) (&(p->msg.command)))[0], ((char*) (&(p->msg.command)))[1], ((char*) (&(p->msg.command)))[2], ((char*) (&(p->msg.command)))[3]); print_packet("recv", p); switch(p->msg.command){ case A_SYNC: return; case A_CNXN: /* CONNECT(version, maxdata, "system-id-string") */ /* XXX verify version, etc */ /* if(t->connection_state != CS_OFFLINE) { t->connection_state = CS_OFFLINE; handle_offline(t); } parse_banner((char*) p->data, t); handle_online(); */ break; case A_OPEN: /* OPEN(local-id, 0, "destination") */ // TODO not support -> drop packet /* if(t->connection_state != CS_OFFLINE) { char *name = (char*) p->data; name[p->msg.data_length > 0 ? p->msg.data_length - 1 : 0] = 0; } */ break; case A_OKAY: /* READY(local-id, remote-id, "") */ if (id == -1 && p->msg.arg1 == seed) { /* it's first OKAY reply */ adb_mutex_lock(&packet_lock); id = seed; remote_id = p->msg.arg0; D("remote_id %d\n", remote_id); adb_mutex_unlock(&packet_lock); clear_received_packet(); store_received_packet(p); p = NULL; } else if(id == p->msg.arg0 && remote_id == p->msg.arg1) { // TODO check OKAY store_received_packet(p); p = NULL; } /* if(t->connection_state != CS_OFFLINE) { } */ break; case A_CLSE: /* CLOSE(local-id, remote-id, "") */ // TODO handle closing shell if ((p->msg.arg0 == remote_id || p->msg.arg0 == 0) && p->msg.arg1 == id) { store_received_packet(p); p = NULL; } /* if(t->connection_state != CS_OFFLINE) { } */ break; case A_WRTE: /*if(t->connection_state != CS_OFFLINE) */{ if(p->msg.arg0 == remote_id) { if(p->msg.data_length > 0) { store_received_packet(p); p = NULL; } send_ready(t); } } break; default: printf("handle_packet: what is %08x?!\n", p->msg.command); } if (p) { put_apacket(p); } }
void handle_packet(apacket *p, atransport *t) { D("handle_packet() %c%c%c%c", ((char*) (&(p->msg.command)))[0], ((char*) (&(p->msg.command)))[1], ((char*) (&(p->msg.command)))[2], ((char*) (&(p->msg.command)))[3]); print_packet("recv", p); switch(p->msg.command){ case A_SYNC: if (p->msg.arg0){ send_packet(p, t); #if ADB_HOST send_connect(t); #endif } else { t->connection_state = kCsOffline; handle_offline(t); send_packet(p, t); } return; case A_CNXN: // CONNECT(version, maxdata, "system-id-string") handle_new_connection(t, p); break; case A_AUTH: if (p->msg.arg0 == ADB_AUTH_TOKEN) { t->connection_state = kCsUnauthorized; send_auth_response(p->data, p->msg.data_length, t); } else if (p->msg.arg0 == ADB_AUTH_SIGNATURE) { if (adb_auth_verify(t->token, sizeof(t->token), p->data, p->msg.data_length)) { adb_auth_verified(t); t->failed_auth_attempts = 0; } else { if (t->failed_auth_attempts++ > 256) adb_sleep_ms(1000); send_auth_request(t); } } else if (p->msg.arg0 == ADB_AUTH_RSAPUBLICKEY) { adb_auth_confirm_key(p->data, p->msg.data_length, t); } break; case A_OPEN: /* OPEN(local-id, 0, "destination") */ if (t->online && p->msg.arg0 != 0 && p->msg.arg1 == 0) { char *name = (char*) p->data; name[p->msg.data_length > 0 ? p->msg.data_length - 1 : 0] = 0; asocket* s = create_local_service_socket(name, t); if (s == nullptr) { send_close(0, p->msg.arg0, t); } else { s->peer = create_remote_socket(p->msg.arg0, t); s->peer->peer = s; send_ready(s->id, s->peer->id, t); s->ready(s); } } break; case A_OKAY: /* READY(local-id, remote-id, "") */ if (t->online && p->msg.arg0 != 0 && p->msg.arg1 != 0) { asocket* s = find_local_socket(p->msg.arg1, 0); if (s) { if(s->peer == 0) { /* On first READY message, create the connection. */ s->peer = create_remote_socket(p->msg.arg0, t); s->peer->peer = s; s->ready(s); } else if (s->peer->id == p->msg.arg0) { /* Other READY messages must use the same local-id */ s->ready(s); } else { D("Invalid A_OKAY(%d,%d), expected A_OKAY(%d,%d) on transport %s", p->msg.arg0, p->msg.arg1, s->peer->id, p->msg.arg1, t->serial); } } else { // When receiving A_OKAY from device for A_OPEN request, the host server may // have closed the local socket because of client disconnection. Then we need // to send A_CLSE back to device to close the service on device. send_close(p->msg.arg1, p->msg.arg0, t); } } break; case A_CLSE: /* CLOSE(local-id, remote-id, "") or CLOSE(0, remote-id, "") */ if (t->online && p->msg.arg1 != 0) { asocket* s = find_local_socket(p->msg.arg1, p->msg.arg0); if (s) { /* According to protocol.txt, p->msg.arg0 might be 0 to indicate * a failed OPEN only. However, due to a bug in previous ADB * versions, CLOSE(0, remote-id, "") was also used for normal * CLOSE() operations. * * This is bad because it means a compromised adbd could * send packets to close connections between the host and * other devices. To avoid this, only allow this if the local * socket has a peer on the same transport. */ if (p->msg.arg0 == 0 && s->peer && s->peer->transport != t) { D("Invalid A_CLSE(0, %u) from transport %s, expected transport %s", p->msg.arg1, t->serial, s->peer->transport->serial); } else { s->close(s); } } } break; case A_WRTE: /* WRITE(local-id, remote-id, <data>) */ if (t->online && p->msg.arg0 != 0 && p->msg.arg1 != 0) { asocket* s = find_local_socket(p->msg.arg1, p->msg.arg0); if (s) { unsigned rid = p->msg.arg0; p->len = p->msg.data_length; if (s->enqueue(s, p) == 0) { D("Enqueue the socket"); send_ready(s->id, rid, t); } return; } } break; default: printf("handle_packet: what is %08x?!\n", p->msg.command); } put_apacket(p); }
int main(int argc, char **argv) { int result = 0; int i; userui_ops[0] = &userui_text_ops; userui_ops[1] = FBSPLASH_OPS; userui_ops[2] = USPLASH_OPS; active_ops = &userui_text_ops; handle_params(argc, argv); setup_signal_handlers(); open_console(); open_misc(); if (!test_run) { open_netlink(); get_nofreeze(); get_info(); } lock_memory(); prepare_console(); /* Initialise all that we can, use the first */ // active_ops = NULL; for (i = 0; i < NUM_UIS; i++) { if (userui_ops[i] && userui_ops[i]->load) { result = userui_ops[i]->load(); if (result) { if (test_run) fprintf(stderr, "Failed to initialise %s module.\n", userui_ops[i]->name); else printk("Failed to initialise %s module.\n", userui_ops[i]->name); } else if (!active_ops) active_ops = userui_ops[i]; } } if (active_ops->prepare) active_ops->prepare(); register_keypress_handler(); need_cleanup = 1; running = 1; result = nice(1); if (active_ops->memory_required) reserve_memory(active_ops->memory_required()); else reserve_memory(4*1024*1024); /* say 4MB */ enforce_lifesavers(); if (test_run) { safe_to_exit = 0; do_test_run(); return 0; } if (send_ready()) message_loop(); /* The only point we ever reach here is if message_loop crashed out. * If this is the case, we should spin for a few hours before exiting to * ensure that we don't corrupt stuff on disk (if we're past the atomic * copy). */ sleep(60*60*1); /* 1 hours */ _exit(1); }
void lock_emit_webview_ok() { is_ready = TRUE; send_ready(); }
void lock_hello() { if (is_ready) { send_ready(); } }
void handle_packet(apacket *p, atransport *t) { asocket *s; D("handle_packet() %c%c%c%c\n", ((char*) (&(p->msg.command)))[0], ((char*) (&(p->msg.command)))[1], ((char*) (&(p->msg.command)))[2], ((char*) (&(p->msg.command)))[3]); print_packet("recv", p); switch(p->msg.command){ case A_SYNC: if(p->msg.arg0){ send_packet(p, t); if(HOST) send_connect(t); } else { t->connection_state = CS_OFFLINE; handle_offline(t); send_packet(p, t); } return; case A_CNXN: /* CONNECT(version, maxdata, "system-id-string") */ /* XXX verify version, etc */ if(t->connection_state != CS_OFFLINE) { t->connection_state = CS_OFFLINE; handle_offline(t); } parse_banner((char*) p->data, t); handle_online(t); send_connect(t); break; case A_OPEN: /* OPEN(local-id, 0, "destination") */ if (t->online && p->msg.arg0 != 0 && p->msg.arg1 == 0) { char *name = (char*) p->data; name[p->msg.data_length > 0 ? p->msg.data_length - 1 : 0] = 0; s = create_local_service_socket(name); if(s == 0) { send_close(0, p->msg.arg0, t); } else { s->peer = create_remote_socket(p->msg.arg0, t); s->peer->peer = s; send_ready(s->id, s->peer->id, t); s->ready(s); } } break; case A_OKAY: /* READY(local-id, remote-id, "") */ if (t->online && p->msg.arg0 != 0 && p->msg.arg1 != 0) { if((s = find_local_socket(p->msg.arg1, 0))) { if(s->peer == 0) { /* On first READY message, create the connection. */ s->peer = create_remote_socket(p->msg.arg0, t); s->peer->peer = s; s->ready(s); } else if (s->peer->id == p->msg.arg0) { /* Other READY messages must use the same local-id */ s->ready(s); } else { D("Invalid A_OKAY(%d,%d), expected A_OKAY(%d,%d) on transport %s\n", p->msg.arg0, p->msg.arg1, s->peer->id, p->msg.arg1, t->serial); } } } break; case A_CLSE: /* CLOSE(local-id, remote-id, "") */ if (t->online && p->msg.arg1 != 0) { if((s = find_local_socket(p->msg.arg1, p->msg.arg0))) { /* According to protocol.txt, p->msg.arg0 might be 0 to indicate * a failed OPEN only. However, due to a bug in previous ADB * versions, CLOSE(0, remote-id, "") was also used for normal * CLOSE() operations. * * This is bad because it means a compromised adbd could * send packets to close connections between the host and * other devices. To avoid this, only allow this if the local * socket has a peer on the same transport. */ if (p->msg.arg0 == 0 && s->peer && s->peer->transport != t) { D("Invalid A_CLSE(0, %u) from transport %s, expected transport %s\n", p->msg.arg1, t->serial, s->peer->transport->serial); } else { s->close(s); } } } break; case A_WRTE: if (t->online && p->msg.arg0 != 0 && p->msg.arg1 != 0) { if((s = find_local_socket(p->msg.arg1, p->msg.arg0))) { unsigned rid = p->msg.arg0; p->len = p->msg.data_length; if(s->enqueue(s, p) == 0) { D("Enqueue the socket\n"); send_ready(s->id, rid, t); } return; } } break; default: printf("handle_packet: what is %08x?!\n", p->msg.command); } put_apacket(p); }
void mouseClick(int button, int state, int x, int y) { float *objectCoords = getRayFromMouse(x, y); float posXs = *objectCoords; float posYs = *(++objectCoords); float posZs = *(++objectCoords); float posXe = *(++objectCoords); float posYe = *(++objectCoords); float posZe = *(++objectCoords); if (button == GLUT_LEFT_BUTTON) { // button release if (state == GLUT_UP) { if (gameData.get_game_state() == CHAT_SCREEN) { if (x > 100 && y > 510 && x < 220 && y < 550) { messages.push_back("...ready..."); glutPostRedisplay(); send_ready(); gameData.toggle_player_ready(); } } else if (gameData.get_game_state() == GAME) { if (cardGrabbed) { if (hoverCard->getY() > -0.35f) play_card(hoverID); cardGrabbed = false; } else if (attack_drag) { //&& hoverCard != attackingCard // some allowance for click-and-move? // check attack ... if (hoverCard != nullptr && hoverCard->isAttackable()) { // attack. send_attack(attackerID, hoverID); gameData.setup_attack(attackerID, hoverID); gameData.queue_action(&attack); } attack_drag = false; for (auto &it : opponent.in_play) { it.second.set_attackable(false); } } position_hand(player.hand); movX = 0; movY = 0; arrow_head_x = 0; arrow_head_y = 0; } } else if (state == GLUT_DOWN) { if (gameData.get_game_state() == GAME) { if (gameData.is_my_turn() && hoverCard == nullptr) { float t = (0.0f - posZs) / (posZe - posZs); float x = posXs + t*(posXe - posXs); float y = posYs + t*(posYe - posYs); if (x > 1.7f && y > 0.0f && x < 2.0f && y < 0.15f) { gameData.queue_action(&end_turn); } } if (gameData.is_my_turn() && hoverCard != nullptr) { if (player.hand.find(hoverID) != player.hand.end() && hoverCard->getCard().getCost() <= gameData.get_energy_player().get_current()) { cardGrabbed = true; } else if (player.in_play.find(hoverID) != player.in_play.end() && hoverCard->getCard().can_attack()) { attackingCard = hoverCard; attackerID = hoverID; attack_drag = true; arrow_head_x = hoverCard->getX() + 0.075f; arrow_head_y = hoverCard->getY() + 0.15f; bool taunt_present = false; for (auto &it : opponent.in_play) { // Highlighting creatures that can be attacked. // Problem -> visual feedback on which one you're choosing. if (it.second.getCard().getStatus() & STATUS_TAUNT) { it.second.set_attackable(true); taunt_present = true; } } for (auto &it : opponent.in_play) { if (!(it.second.getCard().getStatus() & STATUS_TAUNT)) { if (!taunt_present) { it.second.set_attackable(true); } else { it.second.set_attackable(false); } } } } } } } } glutPostRedisplay(); }