| /* |
| * This parses the command line arguments. It was seperated from main.c by |
| * Justin Dearing <jdeari01@longisland.poly.edu>. |
| */ |
| |
| /* |
| * LibVNCServer (C) 2001 Johannes E. Schindelin <Johannes.Schindelin@gmx.de> |
| * Original OSXvnc (C) 2001 Dan McGuirk <mcguirk@incompleteness.net>. |
| * Original Xvnc (C) 1999 AT&T Laboratories Cambridge. |
| * All Rights Reserved. |
| * |
| * see GPL (latest version) for full details |
| */ |
| |
| #include <rfb/rfb.h> |
| |
| 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; |
| } |
| |