static void* listenerRun(void *data) { rfbScreenInfoPtr rfbScreen=(rfbScreenInfoPtr)data; int client_fd; struct sockaddr_in peer; rfbClientPtr cl; socklen_t len; if (rfbScreen->inetdSock != -1) { cl = rfbNewClient(rfbScreen, rfbScreen->inetdSock); if (cl && !cl->onHold ) rfbStartOnHoldClient(cl); return 0; } len = sizeof(peer); /* TODO: this thread wont die by restarting the server */ while ((client_fd = accept(rfbScreen->rfbListenSock, (struct sockaddr*)&peer, &len)) >= 0) { cl = rfbNewClient(rfbScreen,client_fd); len = sizeof(peer); if (cl && !cl->onHold ) rfbStartOnHoldClient(cl); } return NULL; }
static void* listenerRun(void *data) { rfbScreenInfoPtr screen=(rfbScreenInfoPtr)data; int client_fd; struct sockaddr_storage peer; rfbClientPtr cl = NULL; socklen_t len; fd_set listen_fds; /* temp file descriptor list for select() */ /* TODO: this thread wont die by restarting the server */ /* TODO: HTTP is not handled */ while (1) { client_fd = -1; FD_ZERO(&listen_fds); if(screen->listenSock >= 0) FD_SET(screen->listenSock, &listen_fds); if(screen->listen6Sock >= 0) FD_SET(screen->listen6Sock, &listen_fds); if (select(screen->maxFd+1, &listen_fds, NULL, NULL, NULL) == -1) { rfbLogPerror("listenerRun: error in select"); return NULL; } /* there is something on the listening sockets, handle new connections */ len = sizeof (peer); if (FD_ISSET(screen->listenSock, &listen_fds)) client_fd = accept(screen->listenSock, (struct sockaddr*)&peer, &len); else if (FD_ISSET(screen->listen6Sock, &listen_fds)) client_fd = accept(screen->listen6Sock, (struct sockaddr*)&peer, &len); if(client_fd >= 0) cl = rfbNewClient(screen,client_fd); if (cl && !cl->onHold ) rfbStartOnHoldClient(cl); } return(NULL); }
static void* listenerRun(void *data) { rfbScreenInfoPtr screen=(rfbScreenInfoPtr)data; int client_fd; struct sockaddr_in peer; rfbClientPtr cl; socklen_t len; len = sizeof(peer); /* TODO: this thread wont die by restarting the server */ /* TODO: HTTP is not handled */ while ((client_fd = accept(screen->listenSock, (struct sockaddr*)&peer, &len)) >= 0) { cl = rfbNewClient(screen,client_fd); len = sizeof(peer); if (cl && !cl->onHold ) rfbStartOnHoldClient(cl); } return(NULL); }
int main(int argc, char **argv) { //pipe signals signal(SIGINT, close_app); signal(SIGKILL, close_app); signal(SIGILL, close_app); long usec; if(argc > 1) { int i=1; int r; while(i < argc) { if(*argv[i] == '-') { switch(*(argv[i] + 1)) { case 'h': printUsage(argv); exit(0); break; case 'p': i++; strcpy(VNC_PASSWORD,argv[i]); break; case 'f': i++; FB_setDevice(argv[i]); break; case 'z': i++; display_rotate_180=1; break; case 'P': i++; VNC_PORT=atoi(argv[i]); break; case 'r': i++; r = atoi(argv[i]); if (r==0 || r==90 || r==180 || r==270) rotation = r; L("rotating to %d degrees\n",rotation); break; case 's': i++; r=atoi(argv[i]); if (r >= 1 && r <= 150) scaling = r; else scaling = 100; L("scaling to %d%%\n",scaling); break; case 'R': i++; extractReverseHostPort(argv[i]); break; case 'm': i++; if (!strcmp(argv[i],"adb")){ method = ADB; L("ADB display grabber selected\n"); } else if (!strcmp(argv[i],"fb")) { method = FRAMEBUFFER; L("Framebuffer display grabber selected\n"); } else if (!strcmp(argv[i],"gralloc")) { method = GRALLOC; L("Gralloc display grabber selected\n"); } else if (!strcmp(argv[i],"flinger")) { method = FLINGER; L("Flinger display grabber selected\n"); } else { L("Grab method \"%s\" not found, sticking with auto-detection.\n",argv[i]); } break; } } i++; } } L("Initializing grabber method...\n"); initGrabberMethod(); L("Initializing virtual keyboard and touch device...\n"); initInput(); L("Initializing VNC server:\n"); L(" width: %d\n", (int)screenformat.width); L(" height: %d\n", (int)screenformat.height); L(" bpp: %d\n", (int)screenformat.bitsPerPixel); L(" port: %d\n", (int)VNC_PORT); L("Colourmap_rgba=%d:%d:%d:%d lenght=%d:%d:%d:%d\n", screenformat.redShift, screenformat.greenShift, screenformat.blueShift,screenformat.alphaShift, screenformat.redMax,screenformat.greenMax,screenformat.blueMax,screenformat.alphaMax); initVncServer(argc, argv); bindIPCserver(); sendServerStarted(); if (rhost) { rfbClientPtr cl; cl = rfbReverseConnection(vncscr, rhost, rport); if (cl == NULL) { char *str=malloc(255*sizeof(char)); sprintf(str,"~SHOW|Couldn't connect to remote host:\n%s\n",rhost); L("Couldn't connect to remote host: %s\n",rhost); sendMsgToGui(str); free(str); } else { cl->onHold = FALSE; rfbStartOnHoldClient(cl); } } while (1) { usec=(vncscr->deferUpdateTime+standby)*1000; //clock_t start = clock(); rfbProcessEvents(vncscr,usec); if (idle) standby+=2; else standby=2; if (vncscr->clientHead == NULL) { idle=1; standby=50; continue; } update_screen(); //printf ( "%f\n", ( (double)clock() - start )*1000 / CLOCKS_PER_SEC ); } close_app(); }