2 * This parses the command line arguments. It was seperated from main.c by
3 * Justin Dearing <jdeari01@longisland.poly.edu>.
7 * LibVNCServer (C) 2001 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
8 * Original OSXvnc (C) 2001 Dan McGuirk <mcguirk@incompleteness.net>.
9 * Original Xvnc (C) 1999 AT&T Laboratories Cambridge.
10 * All Rights Reserved.
12 * see GPL (latest version) for full details
17 extern int rfbStringToAddr(char *str, in_addr_t *iface);
22 rfbProtocolExtension* extension;
24 fprintf(stderr, "-rfbport port TCP port for RFB protocol\n");
25 fprintf(stderr, "-rfbwait time max time in ms to wait for RFB client\n");
26 fprintf(stderr, "-rfbauth passwd-file use authentication on RFB protocol\n"
27 " (use 'storepasswd' to create a password file)\n");
28 fprintf(stderr, "-rfbversion 3.x Set the version of the RFB we choose to advertise\n");
29 fprintf(stderr, "-permitfiletransfer permit file transfer support\n");
30 fprintf(stderr, "-passwd plain-password use authentication \n"
31 " (use plain-password as password, USE AT YOUR RISK)\n");
32 fprintf(stderr, "-deferupdate time time in ms to defer updates "
34 fprintf(stderr, "-deferptrupdate time time in ms to defer pointer updates"
36 fprintf(stderr, "-desktop name VNC desktop name (default \"LibVNCServer\")\n");
37 fprintf(stderr, "-alwaysshared always treat new clients as shared\n");
38 fprintf(stderr, "-nevershared never treat new clients as shared\n");
39 fprintf(stderr, "-dontdisconnect don't disconnect existing clients when a "
41 " connection comes in (refuse new connection "
43 fprintf(stderr, "-httpdir dir-path enable http server using dir-path home\n");
44 fprintf(stderr, "-httpport portnum use portnum for http connection\n");
45 fprintf(stderr, "-enablehttpproxy enable http proxy support\n");
46 fprintf(stderr, "-progressive height enable progressive updating for slow links\n");
47 fprintf(stderr, "-listen ipaddr listen for connections only on network interface with\n");
48 fprintf(stderr, " addr ipaddr. '-listen localhost' and hostname work too.\n");
50 for(extension=rfbGetExtensionIterator();extension;extension=extension->next)
53 rfbReleaseExtensionIterator();
56 /* purges COUNT arguments from ARGV at POSITION and decrements ARGC.
57 POSITION points to the first non purged argument afterwards. */
58 void rfbPurgeArguments(int* argc,int* position,int count,char *argv[])
60 int amount=(*argc)-(*position)-count;
62 memmove(argv+(*position),argv+(*position)+count,sizeof(char*)*amount);
67 rfbProcessArguments(rfbScreenInfoPtr rfbScreen,int* argc, char *argv[])
71 if(!argc) return TRUE;
73 for (i = i1 = 1; i < *argc;) {
74 if (strcmp(argv[i], "-help") == 0) {
77 } else if (strcmp(argv[i], "-rfbport") == 0) { /* -rfbport port */
82 rfbScreen->port = atoi(argv[++i]);
83 } else if (strcmp(argv[i], "-rfbwait") == 0) { /* -rfbwait ms */
88 rfbScreen->maxClientWait = atoi(argv[++i]);
89 } else if (strcmp(argv[i], "-rfbauth") == 0) { /* -rfbauth passwd-file */
94 rfbScreen->authPasswdData = argv[++i];
96 } else if (strcmp(argv[i], "-permitfiletransfer") == 0) { /* -permitfiletransfer */
97 rfbScreen->permitFileTransfer = TRUE;
98 } else if (strcmp(argv[i], "-rfbversion") == 0) { /* -rfbversion 3.6 */
103 sscanf(argv[++i],"%d.%d", &rfbScreen->protocolMajorVersion, &rfbScreen->protocolMinorVersion);
104 } else if (strcmp(argv[i], "-passwd") == 0) { /* -passwd password */
105 char **passwds = malloc(sizeof(char**)*2);
106 if (i + 1 >= *argc) {
110 passwds[0] = argv[++i];
112 rfbScreen->authPasswdData = (void*)passwds;
113 rfbScreen->passwordCheck = rfbCheckPasswordByList;
114 } else if (strcmp(argv[i], "-deferupdate") == 0) { /* -deferupdate milliseconds */
115 if (i + 1 >= *argc) {
119 rfbScreen->deferUpdateTime = atoi(argv[++i]);
120 } else if (strcmp(argv[i], "-deferptrupdate") == 0) { /* -deferptrupdate milliseconds */
121 if (i + 1 >= *argc) {
125 rfbScreen->deferPtrUpdateTime = atoi(argv[++i]);
126 } else if (strcmp(argv[i], "-desktop") == 0) { /* -desktop desktop-name */
127 if (i + 1 >= *argc) {
131 rfbScreen->desktopName = argv[++i];
132 } else if (strcmp(argv[i], "-alwaysshared") == 0) {
133 rfbScreen->alwaysShared = TRUE;
134 } else if (strcmp(argv[i], "-nevershared") == 0) {
135 rfbScreen->neverShared = TRUE;
136 } else if (strcmp(argv[i], "-dontdisconnect") == 0) {
137 rfbScreen->dontDisconnect = TRUE;
138 } else if (strcmp(argv[i], "-httpdir") == 0) { /* -httpdir directory-path */
139 if (i + 1 >= *argc) {
143 rfbScreen->httpDir = argv[++i];
144 } else if (strcmp(argv[i], "-httpport") == 0) { /* -httpport portnum */
145 if (i + 1 >= *argc) {
149 rfbScreen->httpPort = atoi(argv[++i]);
150 } else if (strcmp(argv[i], "-enablehttpproxy") == 0) {
151 rfbScreen->httpEnableProxyConnect = TRUE;
152 } else if (strcmp(argv[i], "-progressive") == 0) { /* -httpport portnum */
153 if (i + 1 >= *argc) {
157 rfbScreen->progressiveSliceHeight = atoi(argv[++i]);
158 } else if (strcmp(argv[i], "-listen") == 0) { /* -listen ipaddr */
159 if (i + 1 >= *argc) {
163 if (! rfbStringToAddr(argv[++i], &(rfbScreen->listenInterface))) {
167 rfbProtocolExtension* extension;
170 for(extension=rfbGetExtensionIterator();handled==0 && extension;
171 extension=extension->next)
172 if(extension->processArgument)
173 handled = extension->processArgument(*argc - i, argv + i);
174 rfbReleaseExtensionIterator();
183 /* we just remove the processed arguments from the list */
184 rfbPurgeArguments(argc,&i1,i-i1+1,argv);
191 rfbProcessSizeArguments(int* width,int* height,int* bpp,int* argc, char *argv[])
195 if(!argc) return TRUE;
196 for (i = i1 = 1; i < *argc-1;) {
197 if (strcmp(argv[i], "-bpp") == 0) {
198 *bpp = atoi(argv[++i]);
199 } else if (strcmp(argv[i], "-width") == 0) {
200 *width = atoi(argv[++i]);
201 } else if (strcmp(argv[i], "-height") == 0) {
202 *height = atoi(argv[++i]);
208 rfbPurgeArguments(argc,&i1,i-i1,argv);