int ddxProcessArgument(int argc, char *argv[], int i) { static Bool firstTime = TRUE; if (firstTime) { vfbInitializeDefaultScreens(); vfbInitializePixmapDepths(); firstTime = FALSE; } #define CHECK_FOR_REQUIRED_ARGUMENTS(num) \ if (((i + num) >= argc) || (!argv[i + num])) { \ ErrorF("Required argument to %s not specified\n", argv[i]); \ UseMsg(); \ FatalError("Required argument to %s not specified\n", argv[i]); \ } if (strcmp (argv[i], "-screen") == 0) /* -screen n WxHxD */ { int screenNum; CHECK_FOR_REQUIRED_ARGUMENTS(2); screenNum = atoi(argv[i+1]); if (screenNum < 0 || screenNum >= MAXSCREENS) { ErrorF("Invalid screen number %d\n", screenNum); UseMsg(); FatalError("Invalid screen number %d passed to -screen\n", screenNum); } if (3 != sscanf(argv[i+2], "%dx%dx%d", &vfbScreens[screenNum].width, &vfbScreens[screenNum].height, &vfbScreens[screenNum].depth)) { ErrorF("Invalid screen configuration %s\n", argv[i+2]); UseMsg(); FatalError("Invalid screen configuration %s for -screen %d\n", argv[i+2], screenNum); } if (screenNum >= vfbNumScreens) vfbNumScreens = screenNum + 1; lastScreen = screenNum; return 3; } if (strcmp (argv[i], "-pixdepths") == 0) /* -pixdepths list-of-depth */ { int depth, ret = 1; CHECK_FOR_REQUIRED_ARGUMENTS(1); while ((++i < argc) && (depth = atoi(argv[i])) != 0) { if (depth < 0 || depth > 32) { ErrorF("Invalid pixmap depth %d\n", depth); UseMsg(); FatalError("Invalid pixmap depth %d passed to -pixdepths\n", depth); } vfbPixmapDepths[depth] = TRUE; ret++; } return ret; } if (strcmp (argv[i], "+render") == 0) /* +render */ { Render = TRUE; return 1; } if (strcmp (argv[i], "-render") == 0) /* -render */ { Render = FALSE; #ifdef COMPOSITE noCompositeExtension = TRUE; #endif return 1; } if (strcmp (argv[i], "-blackpixel") == 0) /* -blackpixel n */ { Pixel pix; CHECK_FOR_REQUIRED_ARGUMENTS(1); pix = atoi(argv[++i]); if (-1 == lastScreen) { int i; for (i = 0; i < MAXSCREENS; i++) { vfbScreens[i].blackPixel = pix; } } else { vfbScreens[lastScreen].blackPixel = pix; } return 2; } if (strcmp (argv[i], "-whitepixel") == 0) /* -whitepixel n */ { Pixel pix; CHECK_FOR_REQUIRED_ARGUMENTS(1); pix = atoi(argv[++i]); if (-1 == lastScreen) { int i; for (i = 0; i < MAXSCREENS; i++) { vfbScreens[i].whitePixel = pix; } } else { vfbScreens[lastScreen].whitePixel = pix; } return 2; } if (strcmp (argv[i], "-linebias") == 0) /* -linebias n */ { unsigned int linebias; CHECK_FOR_REQUIRED_ARGUMENTS(1); linebias = atoi(argv[++i]); if (-1 == lastScreen) { int i; for (i = 0; i < MAXSCREENS; i++) { vfbScreens[i].lineBias = linebias; } } else { vfbScreens[lastScreen].lineBias = linebias; } return 2; } #ifdef HAS_MMAP if (strcmp (argv[i], "-fbdir") == 0) /* -fbdir directory */ { CHECK_FOR_REQUIRED_ARGUMENTS(1); pfbdir = argv[++i]; fbmemtype = MMAPPED_FILE_FB; return 2; } #endif /* HAS_MMAP */ #ifdef HAS_SHM if (strcmp (argv[i], "-shmem") == 0) /* -shmem */ { fbmemtype = SHARED_MEMORY_FB; return 1; } #endif return 0; }
int ddxProcessArgument(int argc, char *argv[], int i) { static Bool firstTime = TRUE; static int lastScreen = -1; vfbScreenInfo *currentScreen; if (firstTime) { vfbInitializePixmapDepths(); firstTime = FALSE; } if (lastScreen == -1) currentScreen = &defaultScreenInfo; else currentScreen = &vfbScreens[lastScreen]; #define CHECK_FOR_REQUIRED_ARGUMENTS(num) \ if (((i + num) >= argc) || (!argv[i + num])) { \ ErrorF("Required argument to %s not specified\n", argv[i]); \ UseMsg(); \ FatalError("Required argument to %s not specified\n", argv[i]); \ } if (strcmp (argv[i], "-screen") == 0) /* -screen n WxHxD */ { int screenNum; CHECK_FOR_REQUIRED_ARGUMENTS(2); screenNum = atoi(argv[i+1]); /* The protocol only has a CARD8 for number of screens in the connection setup block, so don't allow more than that. */ if ((screenNum < 0) || (screenNum >= 255)) { ErrorF("Invalid screen number %d\n", screenNum); UseMsg(); FatalError("Invalid screen number %d passed to -screen\n", screenNum); } if (vfbNumScreens <= screenNum) { vfbScreens = realloc(vfbScreens, sizeof(*vfbScreens) * (screenNum + 1)); if (!vfbScreens) FatalError("Not enough memory for screen %d\n", screenNum); for (; vfbNumScreens <= screenNum; ++vfbNumScreens) vfbScreens[vfbNumScreens] = defaultScreenInfo; } if (3 != sscanf(argv[i+2], "%dx%dx%d", &vfbScreens[screenNum].width, &vfbScreens[screenNum].height, &vfbScreens[screenNum].depth)) { ErrorF("Invalid screen configuration %s\n", argv[i+2]); UseMsg(); FatalError("Invalid screen configuration %s for -screen %d\n", argv[i+2], screenNum); } lastScreen = screenNum; return 3; } if (strcmp (argv[i], "-pixdepths") == 0) /* -pixdepths list-of-depth */ { int depth, ret = 1; CHECK_FOR_REQUIRED_ARGUMENTS(1); while ((++i < argc) && (depth = atoi(argv[i])) != 0) { if (depth < 0 || depth > 32) { ErrorF("Invalid pixmap depth %d\n", depth); UseMsg(); FatalError("Invalid pixmap depth %d passed to -pixdepths\n", depth); } vfbPixmapDepths[depth] = TRUE; ret++; } return ret; } if (strcmp (argv[i], "+render") == 0) /* +render */ { Render = TRUE; return 1; } if (strcmp (argv[i], "-render") == 0) /* -render */ { Render = FALSE; #ifdef COMPOSITE noCompositeExtension = TRUE; #endif return 1; } if (strcmp (argv[i], "-blackpixel") == 0) /* -blackpixel n */ { CHECK_FOR_REQUIRED_ARGUMENTS(1); currentScreen->blackPixel = atoi(argv[++i]); return 2; } if (strcmp (argv[i], "-whitepixel") == 0) /* -whitepixel n */ { CHECK_FOR_REQUIRED_ARGUMENTS(1); currentScreen->whitePixel = atoi(argv[++i]); return 2; } if (strcmp (argv[i], "-linebias") == 0) /* -linebias n */ { CHECK_FOR_REQUIRED_ARGUMENTS(1); currentScreen->lineBias = atoi(argv[++i]); return 2; } #ifdef HAVE_MMAP if (strcmp (argv[i], "-fbdir") == 0) /* -fbdir directory */ { CHECK_FOR_REQUIRED_ARGUMENTS(1); pfbdir = argv[++i]; fbmemtype = MMAPPED_FILE_FB; return 2; } #endif /* HAVE_MMAP */ #ifdef HAS_SHM if (strcmp (argv[i], "-shmem") == 0) /* -shmem */ { fbmemtype = SHARED_MEMORY_FB; return 1; } #endif return 0; }
int ddxProcessArgument(int argc, char *argv[], int i) { static Bool firstTime = TRUE; if (firstTime) { /* Force -noreset as default until we properly handle resets */ dispatchExceptionAtReset = 0; vfbInitializeDefaultScreens(); vfbInitializePixmapDepths(); firstTime = FALSE; vncInitRFB(); } if (argv[i][0] == ':') displaySpecified = TRUE; if (strcmp (argv[i], "-screen") == 0) /* -screen n WxHxD */ { int screenNum; fail_unless_args(argc, i, 2); screenNum = atoi(argv[i+1]); if (screenNum < 0 || screenNum >= MAXSCREENS) { ErrorF("Invalid screen number %d\n", screenNum); UseMsg(); return 0; } if (3 != sscanf(argv[i+2], "%dx%dx%d", &vfbScreens[screenNum].fb.width, &vfbScreens[screenNum].fb.height, &vfbScreens[screenNum].fb.depth)) { ErrorF("Invalid screen configuration %s\n", argv[i+2]); UseMsg(); return 0; } if (screenNum >= vfbNumScreens) vfbNumScreens = screenNum + 1; lastScreen = screenNum; return 3; } if (strcmp (argv[i], "-pixdepths") == 0) /* -pixdepths list-of-depth */ { int depth, ret = 1; fail_unless_args(argc, i, 1); ++i; while ((i < argc) && (depth = atoi(argv[i++])) != 0) { if (depth < 0 || depth > 32) { ErrorF("Invalid pixmap depth %d\n", depth); UseMsg(); return 0; } vfbPixmapDepths[depth] = TRUE; ret++; } return ret; } if (strcmp (argv[i], "+render") == 0) /* +render */ { Render = TRUE; return 1; } if (strcmp (argv[i], "-render") == 0) /* -render */ { Render = FALSE; return 1; } if (strcmp (argv[i], "-blackpixel") == 0) /* -blackpixel n */ { Pixel pix; fail_unless_args(argc, i, 1); ++i; pix = atoi(argv[i]); if (-1 == lastScreen) { int j; for (j = 0; j < MAXSCREENS; j++) { vfbScreens[j].blackPixel = pix; } } else { vfbScreens[lastScreen].blackPixel = pix; } return 2; } if (strcmp (argv[i], "-whitepixel") == 0) /* -whitepixel n */ { Pixel pix; fail_unless_args(argc, i, 1); ++i; pix = atoi(argv[i]); if (-1 == lastScreen) { int j; for (j = 0; j < MAXSCREENS; j++) { vfbScreens[j].whitePixel = pix; } } else { vfbScreens[lastScreen].whitePixel = pix; } return 2; } if (strcmp (argv[i], "-linebias") == 0) /* -linebias n */ { unsigned int linebias; fail_unless_args(argc, i, 1); ++i; linebias = atoi(argv[i]); if (-1 == lastScreen) { int j; for (j = 0; j < MAXSCREENS; j++) { vfbScreens[j].lineBias = linebias; } } else { vfbScreens[lastScreen].lineBias = linebias; } return 2; } #ifdef HAS_SHM if (strcmp (argv[i], "-shmem") == 0) /* -shmem */ { fbmemtype = SHARED_MEMORY_FB; return 1; } #endif if (strcmp(argv[i], "-geometry") == 0) { fail_unless_args(argc, i, 1); ++i; if (sscanf(argv[i],"%dx%d",&vfbScreens[0].fb.width, &vfbScreens[0].fb.height) != 2) { ErrorF("Invalid geometry %s\n", argv[i]); UseMsg(); return 0; } return 2; } if (strcmp(argv[i], "-depth") == 0) { fail_unless_args(argc, i, 1); ++i; vfbScreens[0].fb.depth = atoi(argv[i]); return 2; } if (strcmp(argv[i], "-pixelformat") == 0) { char rgbbgr[4]; int bits1, bits2, bits3; fail_unless_args(argc, i, 1); ++i; if (sscanf(argv[i], "%3s%1d%1d%1d", rgbbgr,&bits1,&bits2,&bits3) < 4) { ErrorF("Invalid pixel format %s\n", argv[i]); UseMsg(); return 0; } #define SET_PIXEL_FORMAT(vfbScreen) \ (vfbScreen).pixelFormatDefined = TRUE; \ (vfbScreen).fb.depth = bits1 + bits2 + bits3; \ (vfbScreen).greenBits = bits2; \ if (strcasecmp(rgbbgr, "bgr") == 0) { \ (vfbScreen).rgbNotBgr = FALSE; \ (vfbScreen).redBits = bits3; \ (vfbScreen).blueBits = bits1; \ } else if (strcasecmp(rgbbgr, "rgb") == 0) { \ (vfbScreen).rgbNotBgr = TRUE; \ (vfbScreen).redBits = bits1; \ (vfbScreen).blueBits = bits3; \ } else { \ ErrorF("Invalid pixel format %s\n", argv[i]); \ UseMsg(); \ return 0; \ } if (-1 == lastScreen) { int j; for (j = 0; j < MAXSCREENS; j++) { SET_PIXEL_FORMAT(vfbScreens[j]); } } else { SET_PIXEL_FORMAT(vfbScreens[lastScreen]); } return 2; } if (strcmp(argv[i], "-inetd") == 0) { dup2(0,3); vncInetdSock = 3; close(2); if (!displaySpecified) { int port = vncGetSocketPort(vncInetdSock); int displayNum = port - 5900; if (displayNum < 0 || displayNum > 99 || !displayNumFree(displayNum)) { for (displayNum = 1; displayNum < 100; displayNum++) if (displayNumFree(displayNum)) break; if (displayNum == 100) FatalError("Xvnc error: no free display number for -inetd"); } display = displayNumStr; sprintf(displayNumStr, "%d", displayNum); } return 1; } if (strcmp(argv[i], "-noclipboard") == 0) { vncNoClipboard = 1; return 1; } if (!strcmp(argv[i], "-verbose")) { if (++i < argc && argv[i]) { char *end; long val; val = strtol(argv[i], &end, 0); if (*end == '\0') { vncVerbose = val; LogSetParameter(XLOG_VERBOSITY, vncVerbose); return 2; } } vncVerbose++; LogSetParameter(XLOG_VERBOSITY, vncVerbose); return 1; } if (!strcmp(argv[i], "-quiet")) { vncVerbose = -1; LogSetParameter(XLOG_VERBOSITY, vncVerbose); return 1; } if (!strcmp(argv[i], "-showconfig") || !strcmp(argv[i], "-version")) { vncPrintBanner(); exit(0); } if (vncSetParamSimple(argv[i])) return 1; if (argv[i][0] == '-' && i+1 < argc) { if (vncSetParam(&argv[i][1], argv[i+1])) return 2; } return 0; }