/apps/desktop/libvncserver/cargs.c

http://ftk.googlecode.com/ · C · 213 lines · 182 code · 16 blank · 15 comment · 87 complexity · e53051428784f341e84d311e92cd35ac MD5 · raw file

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