/* * This parses the command line arguments. It was seperated from main.c by * Justin Dearing . */ /* * LibVNCServer (C) 2001 Johannes E. Schindelin * Original OSXvnc (C) 2001 Dan McGuirk . * Original Xvnc (C) 1999 AT&T Laboratories Cambridge. * All Rights Reserved. * * see GPL (latest version) for full details */ #include extern int rfbStringToAddr(char *str, in_addr_t *iface); void rfbUsage(void) { rfbProtocolExtension* extension; fprintf(stderr, "-rfbport port TCP port for RFB protocol\n"); #ifdef LIBVNCSERVER_IPv6 fprintf(stderr, "-rfbportv6 port TCP6 port for RFB protocol\n"); #endif fprintf(stderr, "-rfbwait time max time in ms to wait for RFB client\n"); fprintf(stderr, "-rfbauth passwd-file use authentication on RFB protocol\n" " (use 'storepasswd' to create a password file)\n"); fprintf(stderr, "-rfbversion 3.x Set the version of the RFB we choose to advertise\n"); fprintf(stderr, "-permitfiletransfer permit file transfer support\n"); fprintf(stderr, "-passwd plain-password use authentication \n" " (use plain-password as password, USE AT YOUR RISK)\n"); fprintf(stderr, "-deferupdate time time in ms to defer updates " "(default 40)\n"); fprintf(stderr, "-deferptrupdate time time in ms to defer pointer updates" " (default none)\n"); fprintf(stderr, "-desktop name VNC desktop name (default \"LibVNCServer\")\n"); fprintf(stderr, "-alwaysshared always treat new clients as shared\n"); fprintf(stderr, "-nevershared never treat new clients as shared\n"); fprintf(stderr, "-dontdisconnect don't disconnect existing clients when a " "new non-shared\n" " connection comes in (refuse new connection " "instead)\n"); fprintf(stderr, "-httpdir dir-path enable http server using dir-path home\n"); fprintf(stderr, "-httpport portnum use portnum for http connection\n"); #ifdef LIBVNCSERVER_IPv6 fprintf(stderr, "-httpportv6 portnum use portnum for IPv6 http connection\n"); #endif fprintf(stderr, "-enablehttpproxy enable http proxy support\n"); fprintf(stderr, "-progressive height enable progressive updating for slow links\n"); fprintf(stderr, "-listen ipaddr listen for connections only on network interface with\n"); fprintf(stderr, " addr ipaddr. '-listen localhost' and hostname work too.\n"); #ifdef LIBVNCSERVER_IPv6 fprintf(stderr, "-listenv6 ipv6addr listen for IPv6 connections only on network interface with\n"); fprintf(stderr, " addr ipv6addr. '-listen localhost' and hostname work too.\n"); #endif for(extension=rfbGetExtensionIterator();extension;extension=extension->next) if(extension->usage) extension->usage(); rfbReleaseExtensionIterator(); } /* purges COUNT arguments from ARGV at POSITION and decrements ARGC. POSITION points to the first non purged argument afterwards. */ void rfbPurgeArguments(int* argc,int* position,int count,char *argv[]) { int amount=(*argc)-(*position)-count; if(amount) memmove(argv+(*position),argv+(*position)+count,sizeof(char*)*amount); (*argc)-=count; } rfbBool rfbProcessArguments(rfbScreenInfoPtr rfbScreen,int* argc, char *argv[]) { int i,i1; if(!argc) return TRUE; for (i = i1 = 1; i < *argc;) { if (strcmp(argv[i], "-help") == 0) { rfbUsage(); return FALSE; } else if (strcmp(argv[i], "-rfbport") == 0) { /* -rfbport port */ if (i + 1 >= *argc) { rfbUsage(); return FALSE; } rfbScreen->port = atoi(argv[++i]); #ifdef LIBVNCSERVER_IPv6 } else if (strcmp(argv[i], "-rfbportv6") == 0) { /* -rfbportv6 port */ if (i + 1 >= *argc) { rfbUsage(); return FALSE; } rfbScreen->ipv6port = atoi(argv[++i]); #endif } else if (strcmp(argv[i], "-rfbwait") == 0) { /* -rfbwait ms */ if (i + 1 >= *argc) { rfbUsage(); return FALSE; } rfbScreen->maxClientWait = atoi(argv[++i]); } else if (strcmp(argv[i], "-rfbauth") == 0) { /* -rfbauth passwd-file */ if (i + 1 >= *argc) { rfbUsage(); return FALSE; } rfbScreen->authPasswdData = argv[++i]; } else if (strcmp(argv[i], "-permitfiletransfer") == 0) { /* -permitfiletransfer */ rfbScreen->permitFileTransfer = TRUE; } else if (strcmp(argv[i], "-rfbversion") == 0) { /* -rfbversion 3.6 */ if (i + 1 >= *argc) { rfbUsage(); return FALSE; } sscanf(argv[++i],"%d.%d", &rfbScreen->protocolMajorVersion, &rfbScreen->protocolMinorVersion); } else if (strcmp(argv[i], "-passwd") == 0) { /* -passwd password */ char **passwds = malloc(sizeof(char**)*2); if (i + 1 >= *argc) { rfbUsage(); return FALSE; } passwds[0] = argv[++i]; passwds[1] = NULL; rfbScreen->authPasswdData = (void*)passwds; rfbScreen->passwordCheck = rfbCheckPasswordByList; } else if (strcmp(argv[i], "-deferupdate") == 0) { /* -deferupdate milliseconds */ if (i + 1 >= *argc) { rfbUsage(); return FALSE; } rfbScreen->deferUpdateTime = atoi(argv[++i]); } else if (strcmp(argv[i], "-deferptrupdate") == 0) { /* -deferptrupdate milliseconds */ if (i + 1 >= *argc) { rfbUsage(); return FALSE; } rfbScreen->deferPtrUpdateTime = atoi(argv[++i]); } else if (strcmp(argv[i], "-desktop") == 0) { /* -desktop desktop-name */ if (i + 1 >= *argc) { rfbUsage(); return FALSE; } rfbScreen->desktopName = argv[++i]; } else if (strcmp(argv[i], "-alwaysshared") == 0) { rfbScreen->alwaysShared = TRUE; } else if (strcmp(argv[i], "-nevershared") == 0) { rfbScreen->neverShared = TRUE; } else if (strcmp(argv[i], "-dontdisconnect") == 0) { rfbScreen->dontDisconnect = TRUE; } else if (strcmp(argv[i], "-httpdir") == 0) { /* -httpdir directory-path */ if (i + 1 >= *argc) { rfbUsage(); return FALSE; } rfbScreen->httpDir = argv[++i]; } else if (strcmp(argv[i], "-httpport") == 0) { /* -httpport portnum */ if (i + 1 >= *argc) { rfbUsage(); return FALSE; } rfbScreen->httpPort = atoi(argv[++i]); #ifdef LIBVNCSERVER_IPv6 } else if (strcmp(argv[i], "-httpportv6") == 0) { /* -httpportv6 portnum */ if (i + 1 >= *argc) { rfbUsage(); return FALSE; } rfbScreen->http6Port = atoi(argv[++i]); #endif } else if (strcmp(argv[i], "-enablehttpproxy") == 0) { rfbScreen->httpEnableProxyConnect = TRUE; } else if (strcmp(argv[i], "-progressive") == 0) { /* -httpport portnum */ if (i + 1 >= *argc) { rfbUsage(); return FALSE; } rfbScreen->progressiveSliceHeight = atoi(argv[++i]); } else if (strcmp(argv[i], "-listen") == 0) { /* -listen ipaddr */ if (i + 1 >= *argc) { rfbUsage(); return FALSE; } if (! rfbStringToAddr(argv[++i], &(rfbScreen->listenInterface))) { return FALSE; } #ifdef LIBVNCSERVER_IPv6 } else if (strcmp(argv[i], "-listenv6") == 0) { /* -listenv6 ipv6addr */ if (i + 1 >= *argc) { rfbUsage(); return FALSE; } rfbScreen->listen6Interface = argv[++i]; #endif #ifdef LIBVNCSERVER_WITH_WEBSOCKETS } else if (strcmp(argv[i], "-sslkeyfile") == 0) { /* -sslkeyfile sslkeyfile */ if (i + 1 >= *argc) { rfbUsage(); return FALSE; } rfbScreen->sslkeyfile = argv[++i]; } else if (strcmp(argv[i], "-sslcertfile") == 0) { /* -sslcertfile sslcertfile */ if (i + 1 >= *argc) { rfbUsage(); return FALSE; } rfbScreen->sslcertfile = argv[++i]; #endif } else { rfbProtocolExtension* extension; int handled=0; for(extension=rfbGetExtensionIterator();handled==0 && extension; extension=extension->next) if(extension->processArgument) handled = extension->processArgument(*argc - i, argv + i); rfbReleaseExtensionIterator(); if(handled==0) { i++; i1=i; continue; } i+=handled-1; } /* we just remove the processed arguments from the list */ rfbPurgeArguments(argc,&i1,i-i1+1,argv); i=i1; } return TRUE; } rfbBool rfbProcessSizeArguments(int* width,int* height,int* bpp,int* argc, char *argv[]) { int i,i1; if(!argc) return TRUE; for (i = i1 = 1; i < *argc-1;) { if (strcmp(argv[i], "-bpp") == 0) { *bpp = atoi(argv[++i]); } else if (strcmp(argv[i], "-width") == 0) { *width = atoi(argv[++i]); } else if (strcmp(argv[i], "-height") == 0) { *height = atoi(argv[++i]); } else { i++; i1=i; continue; } rfbPurgeArguments(argc,&i1,i-i1,argv); i=i1; } return TRUE; }