cargs.c 5.69 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 *  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
 */

15
#include <rfb/rfb.h>
16 17 18 19 20 21 22 23

void
rfbUsage(void)
{
    fprintf(stderr, "-rfbport port          TCP port for RFB protocol\n");
    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");
dscho's avatar
dscho committed
24 25
    fprintf(stderr, "-passwd plain-password use authentication \n"
                    "                       (use plain-password as password, USE AT YOUR RISK)\n");
26 27 28 29 30 31 32 33 34
    fprintf(stderr, "-deferupdate time      time in ms to defer updates "
                                                             "(default 40)\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");
dscho's avatar
dscho committed
35 36 37
    fprintf(stderr, "-httpdir dir-path      enable http server using dir-path home\n");
    fprintf(stderr, "-httpport portnum      use portnum for http connection\n");
    fprintf(stderr, "-enablehttpproxy       enable http proxy support\n");
38 39
}

dscho's avatar
dscho committed
40 41 42 43 44 45 46 47 48 49 50
/* 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;
  (*position)--;
}

51
rfbBool 
52 53 54 55
rfbProcessArguments(rfbScreenInfoPtr rfbScreen,int* argc, char *argv[])
{
    int i,i1;

dscho's avatar
dscho committed
56
    if(!argc) return TRUE;
57
    
58
    for (i = i1 = 1; i < *argc;) {
59 60
        if (strcmp(argv[i], "-help") == 0) {
	    rfbUsage();
61
	    return FALSE;
62
	} else if (strcmp(argv[i], "-rfbport") == 0) { /* -rfbport port */
63 64 65 66 67
            if (i + 1 >= *argc) {
		rfbUsage();
		return FALSE;
	    }
	    rfbScreen->rfbPort = atoi(argv[++i]);
68
        } else if (strcmp(argv[i], "-rfbwait") == 0) {  /* -rfbwait ms */
69 70 71 72 73
            if (i + 1 >= *argc) {
		rfbUsage();
		return FALSE;
	    }
	    rfbScreen->rfbMaxClientWait = atoi(argv[++i]);
74
        } else if (strcmp(argv[i], "-rfbauth") == 0) {  /* -rfbauth passwd-file */
75 76 77 78
            if (i + 1 >= *argc) {
		rfbUsage();
		return FALSE;
	    }
79
            rfbScreen->rfbAuthPasswdData = argv[++i];
dscho's avatar
dscho committed
80 81
	} else if (strcmp(argv[i], "-passwd") == 0) {  /* -passwd password */
	    char **passwds = malloc(sizeof(char**)*2);
82 83 84 85
	    if (i + 1 >= *argc) {
		rfbUsage();
		return FALSE;
	    }
dscho's avatar
dscho committed
86 87
	    passwds[0] = argv[++i];
	    passwds[1] = 0;
88
	    rfbScreen->rfbAuthPasswdData = (void*)passwds;
dscho's avatar
dscho committed
89
	    rfbScreen->passwordCheck = rfbCheckPasswordByList;
90
        } else if (strcmp(argv[i], "-deferupdate") == 0) {  /* -deferupdate milliseconds */
91 92 93 94
            if (i + 1 >= *argc) {
		rfbUsage();
		return FALSE;
	    }
95 96
            rfbScreen->rfbDeferUpdateTime = atoi(argv[++i]);
        } else if (strcmp(argv[i], "-desktop") == 0) {  /* -desktop desktop-name */
97 98 99 100
            if (i + 1 >= *argc) {
		rfbUsage();
		return FALSE;
	    }
101 102 103 104 105 106 107
            rfbScreen->desktopName = argv[++i];
        } else if (strcmp(argv[i], "-alwaysshared") == 0) {
	    rfbScreen->rfbAlwaysShared = TRUE;
        } else if (strcmp(argv[i], "-nevershared") == 0) {
            rfbScreen->rfbNeverShared = TRUE;
        } else if (strcmp(argv[i], "-dontdisconnect") == 0) {
            rfbScreen->rfbDontDisconnect = TRUE;
dscho's avatar
dscho committed
108
        } else if (strcmp(argv[i], "-httpdir") == 0) {  /* -httpdir directory-path */
109 110 111 112
            if (i + 1 >= *argc) {
		rfbUsage();
		return FALSE;
	    }
dscho's avatar
dscho committed
113 114
            rfbScreen->httpDir = argv[++i];
        } else if (strcmp(argv[i], "-httpport") == 0) {  /* -httpport portnum */
115 116 117 118
            if (i + 1 >= *argc) {
		rfbUsage();
		return FALSE;
	    }
dscho's avatar
dscho committed
119 120 121
            rfbScreen->httpPort = atoi(argv[++i]);
        } else if (strcmp(argv[i], "-enablehttpproxy") == 0) {
            rfbScreen->httpEnableProxyConnect = TRUE;
dscho's avatar
dscho committed
122 123 124 125
        } else {
	    /* we just remove the processed arguments from the list */
	    if(i != i1)
	        rfbPurgeArguments(argc,&i1,i-i1,argv);
126
        }
127 128
	i1++;
	i=i1;
129
    }
130
    return TRUE;
131 132 133 134 135 136 137 138
}

void rfbSizeUsage()
{
    fprintf(stderr, "-width                 sets the width of the framebuffer\n");
    fprintf(stderr, "-height                sets the height of the framebuffer\n");
}

139
rfbBool 
140 141 142 143
rfbProcessSizeArguments(int* width,int* height,int* bpp,int* argc, char *argv[])
{
    int i,i1;

144
    if(!argc) return TRUE;
145
    for (i = i1 = 1; i < *argc-1;) {
146 147 148 149 150 151 152 153
        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 {
	    /* we just remove the processed arguments from the list */
154 155 156
	    if(i != i1)
	    if(i != i1)
	        rfbPurgeArguments(argc,&i1,i-i1,argv);
157
        }
158 159
	i1++;
	i=i1;
160
    }
161
    return TRUE;
162 163
}