Home | History | Annotate | Download | only in libvncserver
      1 /*
      2  *  This parses the command line arguments. It was seperated from main.c by
      3  *  Justin Dearing <jdeari01 (at) longisland.poly.edu>.
      4  */
      5 
      6 /*
      7  *  LibVNCServer (C) 2001 Johannes E. Schindelin <Johannes.Schindelin (at) gmx.de>
      8  *  Original OSXvnc (C) 2001 Dan McGuirk <mcguirk (at) incompleteness.net>.
      9  *  Original Xvnc (C) 1999 AT&T Laboratories Cambridge.
     10  *  All Rights Reserved.
     11  *
     12  *  see GPL (latest version) for full details
     13  */
     14 
     15 #include <rfb/rfb.h>
     16 
     17 extern int rfbStringToAddr(char *str, in_addr_t *iface);
     18 
     19 void
     20 rfbUsage(void)
     21 {
     22     rfbProtocolExtension* extension;
     23 
     24     fprintf(stderr, "-rfbport port          TCP port for RFB protocol\n");
     25 #ifdef LIBVNCSERVER_IPv6
     26     fprintf(stderr, "-rfbportv6 port        TCP6 port for RFB protocol\n");
     27 #endif
     28     fprintf(stderr, "-rfbwait time          max time in ms to wait for RFB client\n");
     29     fprintf(stderr, "-rfbauth passwd-file   use authentication on RFB protocol\n"
     30                     "                       (use 'storepasswd' to create a password file)\n");
     31     fprintf(stderr, "-rfbversion 3.x        Set the version of the RFB we choose to advertise\n");
     32     fprintf(stderr, "-permitfiletransfer    permit file transfer support\n");
     33     fprintf(stderr, "-passwd plain-password use authentication \n"
     34                     "                       (use plain-password as password, USE AT YOUR RISK)\n");
     35     fprintf(stderr, "-deferupdate time      time in ms to defer updates "
     36                                                              "(default 40)\n");
     37     fprintf(stderr, "-deferptrupdate time   time in ms to defer pointer updates"
     38                                                            " (default none)\n");
     39     fprintf(stderr, "-desktop name          VNC desktop name (default \"LibVNCServer\")\n");
     40     fprintf(stderr, "-alwaysshared          always treat new clients as shared\n");
     41     fprintf(stderr, "-nevershared           never treat new clients as shared\n");
     42     fprintf(stderr, "-dontdisconnect        don't disconnect existing clients when a "
     43                                                              "new non-shared\n"
     44                     "                       connection comes in (refuse new connection "
     45                                                                 "instead)\n");
     46     fprintf(stderr, "-httpdir dir-path      enable http server using dir-path home\n");
     47     fprintf(stderr, "-httpport portnum      use portnum for http connection\n");
     48 #ifdef LIBVNCSERVER_IPv6
     49     fprintf(stderr, "-httpportv6 portnum    use portnum for IPv6 http connection\n");
     50 #endif
     51     fprintf(stderr, "-enablehttpproxy       enable http proxy support\n");
     52     fprintf(stderr, "-progressive height    enable progressive updating for slow links\n");
     53     fprintf(stderr, "-listen ipaddr         listen for connections only on network interface with\n");
     54     fprintf(stderr, "                       addr ipaddr. '-listen localhost' and hostname work too.\n");
     55 #ifdef LIBVNCSERVER_IPv6
     56     fprintf(stderr, "-listenv6 ipv6addr     listen for IPv6 connections only on network interface with\n");
     57     fprintf(stderr, "                       addr ipv6addr. '-listen localhost' and hostname work too.\n");
     58 #endif
     59 
     60     for(extension=rfbGetExtensionIterator();extension;extension=extension->next)
     61 	if(extension->usage)
     62 		extension->usage();
     63     rfbReleaseExtensionIterator();
     64 }
     65 
     66 /* purges COUNT arguments from ARGV at POSITION and decrements ARGC.
     67    POSITION points to the first non purged argument afterwards. */
     68 void rfbPurgeArguments(int* argc,int* position,int count,char *argv[])
     69 {
     70   int amount=(*argc)-(*position)-count;
     71   if(amount)
     72     memmove(argv+(*position),argv+(*position)+count,sizeof(char*)*amount);
     73   (*argc)-=count;
     74 }
     75 
     76 rfbBool
     77 rfbProcessArguments(rfbScreenInfoPtr rfbScreen,int* argc, char *argv[])
     78 {
     79     int i,i1;
     80 
     81     if(!argc) return TRUE;
     82 
     83     for (i = i1 = 1; i < *argc;) {
     84         if (strcmp(argv[i], "-help") == 0) {
     85 	    rfbUsage();
     86 	    return FALSE;
     87 	} else if (strcmp(argv[i], "-rfbport") == 0) { /* -rfbport port */
     88             if (i + 1 >= *argc) {
     89 		rfbUsage();
     90 		return FALSE;
     91 	    }
     92 	    rfbScreen->port = atoi(argv[++i]);
     93 #ifdef LIBVNCSERVER_IPv6
     94 	} else if (strcmp(argv[i], "-rfbportv6") == 0) { /* -rfbportv6 port */
     95             if (i + 1 >= *argc) {
     96 		rfbUsage();
     97 		return FALSE;
     98 	    }
     99 	    rfbScreen->ipv6port = atoi(argv[++i]);
    100 #endif
    101         } else if (strcmp(argv[i], "-rfbwait") == 0) {  /* -rfbwait ms */
    102             if (i + 1 >= *argc) {
    103 		rfbUsage();
    104 		return FALSE;
    105 	    }
    106 	    rfbScreen->maxClientWait = atoi(argv[++i]);
    107         } else if (strcmp(argv[i], "-rfbauth") == 0) {  /* -rfbauth passwd-file */
    108             if (i + 1 >= *argc) {
    109 		rfbUsage();
    110 		return FALSE;
    111 	    }
    112             rfbScreen->authPasswdData = argv[++i];
    113 
    114         } else if (strcmp(argv[i], "-permitfiletransfer") == 0) {  /* -permitfiletransfer  */
    115             rfbScreen->permitFileTransfer = TRUE;
    116         } else if (strcmp(argv[i], "-rfbversion") == 0) {  /* -rfbversion 3.6  */
    117             if (i + 1 >= *argc) {
    118 		rfbUsage();
    119 		return FALSE;
    120 	    }
    121 	    sscanf(argv[++i],"%d.%d", &rfbScreen->protocolMajorVersion, &rfbScreen->protocolMinorVersion);
    122 	} else if (strcmp(argv[i], "-passwd") == 0) {  /* -passwd password */
    123 	    char **passwds = malloc(sizeof(char**)*2);
    124 	    if (i + 1 >= *argc) {
    125 		rfbUsage();
    126 		return FALSE;
    127 	    }
    128 	    passwds[0] = argv[++i];
    129 	    passwds[1] = NULL;
    130 	    rfbScreen->authPasswdData = (void*)passwds;
    131 	    rfbScreen->passwordCheck = rfbCheckPasswordByList;
    132         } else if (strcmp(argv[i], "-deferupdate") == 0) {  /* -deferupdate milliseconds */
    133             if (i + 1 >= *argc) {
    134 		rfbUsage();
    135 		return FALSE;
    136 	    }
    137             rfbScreen->deferUpdateTime = atoi(argv[++i]);
    138         } else if (strcmp(argv[i], "-deferptrupdate") == 0) {  /* -deferptrupdate milliseconds */
    139             if (i + 1 >= *argc) {
    140 		rfbUsage();
    141 		return FALSE;
    142 	    }
    143             rfbScreen->deferPtrUpdateTime = atoi(argv[++i]);
    144         } else if (strcmp(argv[i], "-desktop") == 0) {  /* -desktop desktop-name */
    145             if (i + 1 >= *argc) {
    146 		rfbUsage();
    147 		return FALSE;
    148 	    }
    149             rfbScreen->desktopName = argv[++i];
    150         } else if (strcmp(argv[i], "-alwaysshared") == 0) {
    151 	    rfbScreen->alwaysShared = TRUE;
    152         } else if (strcmp(argv[i], "-nevershared") == 0) {
    153             rfbScreen->neverShared = TRUE;
    154         } else if (strcmp(argv[i], "-dontdisconnect") == 0) {
    155             rfbScreen->dontDisconnect = TRUE;
    156         } else if (strcmp(argv[i], "-httpdir") == 0) {  /* -httpdir directory-path */
    157             if (i + 1 >= *argc) {
    158 		rfbUsage();
    159 		return FALSE;
    160 	    }
    161             rfbScreen->httpDir = argv[++i];
    162         } else if (strcmp(argv[i], "-httpport") == 0) {  /* -httpport portnum */
    163             if (i + 1 >= *argc) {
    164 		rfbUsage();
    165 		return FALSE;
    166 	    }
    167             rfbScreen->httpPort = atoi(argv[++i]);
    168 #ifdef LIBVNCSERVER_IPv6
    169 	} else if (strcmp(argv[i], "-httpportv6") == 0) {  /* -httpportv6 portnum */
    170             if (i + 1 >= *argc) {
    171 		rfbUsage();
    172 		return FALSE;
    173 	    }
    174             rfbScreen->http6Port = atoi(argv[++i]);
    175 #endif
    176         } else if (strcmp(argv[i], "-enablehttpproxy") == 0) {
    177             rfbScreen->httpEnableProxyConnect = TRUE;
    178         } else if (strcmp(argv[i], "-progressive") == 0) {  /* -httpport portnum */
    179             if (i + 1 >= *argc) {
    180 		rfbUsage();
    181 		return FALSE;
    182 	    }
    183             rfbScreen->progressiveSliceHeight = atoi(argv[++i]);
    184         } else if (strcmp(argv[i], "-listen") == 0) {  /* -listen ipaddr */
    185             if (i + 1 >= *argc) {
    186 		rfbUsage();
    187 		return FALSE;
    188 	    }
    189             if (! rfbStringToAddr(argv[++i], &(rfbScreen->listenInterface))) {
    190                 return FALSE;
    191             }
    192 #ifdef LIBVNCSERVER_IPv6
    193 	} else if (strcmp(argv[i], "-listenv6") == 0) {  /* -listenv6 ipv6addr */
    194             if (i + 1 >= *argc) {
    195 		rfbUsage();
    196 		return FALSE;
    197 	    }
    198 	    rfbScreen->listen6Interface = argv[++i];
    199 #endif
    200 #ifdef LIBVNCSERVER_WITH_WEBSOCKETS
    201         } else if (strcmp(argv[i], "-sslkeyfile") == 0) {  /* -sslkeyfile sslkeyfile */
    202             if (i + 1 >= *argc) {
    203 		rfbUsage();
    204 		return FALSE;
    205 	    }
    206             rfbScreen->sslkeyfile = argv[++i];
    207         } else if (strcmp(argv[i], "-sslcertfile") == 0) {  /* -sslcertfile sslcertfile */
    208             if (i + 1 >= *argc) {
    209 		rfbUsage();
    210 		return FALSE;
    211 	    }
    212             rfbScreen->sslcertfile = argv[++i];
    213 #endif
    214         } else {
    215 	    rfbProtocolExtension* extension;
    216 	    int handled=0;
    217 
    218 	    for(extension=rfbGetExtensionIterator();handled==0 && extension;
    219 			extension=extension->next)
    220 		if(extension->processArgument)
    221 			handled = extension->processArgument(*argc - i, argv + i);
    222 	    rfbReleaseExtensionIterator();
    223 
    224 	    if(handled==0) {
    225 		i++;
    226 		i1=i;
    227 		continue;
    228 	    }
    229 	    i+=handled-1;
    230 	}
    231 	/* we just remove the processed arguments from the list */
    232 	rfbPurgeArguments(argc,&i1,i-i1+1,argv);
    233 	i=i1;
    234     }
    235     return TRUE;
    236 }
    237 
    238 rfbBool
    239 rfbProcessSizeArguments(int* width,int* height,int* bpp,int* argc, char *argv[])
    240 {
    241     int i,i1;
    242 
    243     if(!argc) return TRUE;
    244     for (i = i1 = 1; i < *argc-1;) {
    245         if (strcmp(argv[i], "-bpp") == 0) {
    246                *bpp = atoi(argv[++i]);
    247         } else if (strcmp(argv[i], "-width") == 0) {
    248                *width = atoi(argv[++i]);
    249         } else if (strcmp(argv[i], "-height") == 0) {
    250                *height = atoi(argv[++i]);
    251         } else {
    252 	    i++;
    253 	    i1=i;
    254 	    continue;
    255 	}
    256 	rfbPurgeArguments(argc,&i1,i-i1,argv);
    257 	i=i1;
    258     }
    259     return TRUE;
    260 }
    261 
    262