static void crash_shell(void) { char qry[1000], cmd[1000], line[1000]; char *str, *p; crash_shell_help(); fprintf(stderr, "\ncrash> "); while (fgets(line, 1000, stdin) != NULL) { str = lblanks(line); p = str; while(*p) { if (*p == '\n') { *p = '\0'; } p++; } if (*str == 'q' && *(str+1) == '\0') { fprintf(stderr, "quiting.\n"); return; } else if (*str == 'h' && *(str+1) == '\0') { crash_shell_help(); } else if (*str == '?' && *(str+1) == '\0') { crash_shell_help(); } else if (*str == 's' && *(str+1) == '\0') { sprintf(cmd, "sh -c '(%s) &'", crash_stack_command1); /* crash */ if (no_external_cmds || !cmd_ok("crash")) { fprintf(stderr, "\nno_external_cmds=%d\n", no_external_cmds); goto crash_prompt; } fprintf(stderr, "\nrunning:\n\t%s\n\n", crash_stack_command1); system(cmd); usleep(1000*1000); sprintf(cmd, "sh -c '(%s) &'", crash_stack_command2); fprintf(stderr, "\nrunning:\n\t%s\n\n", crash_stack_command2); system(cmd); usleep(1000*1000); } else { snprintf(qry, 1000, "qry=%s", str); p = process_remote_cmd(qry, 1); fprintf(stderr, "\n\nresult:\n%s\n", p); free(p); } crash_prompt: fprintf(stderr, "crash> "); } }
static int colon_n(char *line) { char *q; int n; q = strrchr(line, ':'); if (! q) { return 0; } q = lblanks(q+1); if (sscanf(q, "%d", &n) == 1) { return n; } return 0; }
static char *colon_str(char *line) { char *q, *p, *t; q = strrchr(line, ':'); if (! q) { return strdup(""); } q = lblanks(q+1); p = strpbrk(q, " \t\n"); if (p) { *p = '\0'; } t = strdup(q); *p = '\n'; return t; }
char *ident_username(rfbClientPtr client) { ClientData *cd = (ClientData *) client->clientData; char *str, *newhost, *user = NULL, *newuser = NULL; int len; if (cd) { user = cd->username; } if (!user || *user == '\0') { int n, sock, ok = 0; int block = 0; int refused = 0; /* * need to check to see if the operation will block for * a long time: a firewall may just ignore our packets. */ #if LIBVNCSERVER_HAVE_FORK { pid_t pid, pidw; int rc; if ((pid = fork()) > 0) { usleep(100 * 1000); /* 0.1 sec for quick success or refusal */ pidw = waitpid(pid, &rc, WNOHANG); if (pidw <= 0) { usleep(1500 * 1000); /* 1.5 sec */ pidw = waitpid(pid, &rc, WNOHANG); if (pidw <= 0) { int rc2; rfbLog("ident_username: set block=1 (hung)\n"); block = 1; kill(pid, SIGTERM); usleep(100 * 1000); waitpid(pid, &rc2, WNOHANG); } } if (pidw > 0 && !block) { if (WIFEXITED(rc) && WEXITSTATUS(rc) == 1) { rfbLog("ident_username: set refused=1 (exit)\n"); refused = 1; } } } else if (pid == -1) { ; } else { /* child */ signal(SIGHUP, SIG_DFL); signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); signal(SIGTERM, SIG_DFL); if ((sock = connect_tcp(client->host, 113)) < 0) { exit(1); } else { close(sock); exit(0); } } } #endif if (block || refused) { ; } else if ((sock = connect_tcp(client->host, 113)) < 0) { rfbLog("ident_username: could not connect to ident: %s:%d\n", client->host, 113); } else { char msg[128]; int ret; fd_set rfds; struct timeval tv; int rport = get_remote_port(client->sock); int lport = get_local_port(client->sock); sprintf(msg, "%d, %d\r\n", rport, lport); n = write(sock, msg, strlen(msg)); FD_ZERO(&rfds); FD_SET(sock, &rfds); tv.tv_sec = 3; tv.tv_usec = 0; ret = select(sock+1, &rfds, NULL, NULL, &tv); if (ret > 0) { int i; char *q, *p; for (i=0; i < (int) sizeof(msg); i++) { msg[i] = '\0'; } usleep(250*1000); n = read(sock, msg, 127); close(sock); if (n <= 0) goto badreply; /* 32782 , 6000 : USERID : UNIX :runge */ q = strstr(msg, "USERID"); if (!q) goto badreply; q = strstr(q, ":"); if (!q) goto badreply; q++; q = strstr(q, ":"); if (!q) goto badreply; q++; q = lblanks(q); p = q; while (*p) { if (*p == '\r' || *p == '\n') { *p = '\0'; } p++; } ok = 1; if (strlen(q) > 24) { *(q+24) = '\0'; } newuser = strdup(q); badreply: n = 0; /* avoid syntax error */ } else { close(sock); } } if (! ok || !newuser) { newuser = strdup("unknown-user"); } if (cd) { if (cd->username) { free(cd->username); } cd->username = newuser; } user = newuser; } if (!strcmp(user, "unknown-user") && cd && cd->unixname[0] != '\0') { user = cd->unixname; } if (unixpw && openssl_last_ip && strstr("UNIX:", user) != user) { newhost = ip2host(openssl_last_ip); } else { newhost = ip2host(client->host); } len = strlen(user) + 1 + strlen(newhost) + 1; str = (char *) malloc(len); sprintf(str, "%s@%s", user, newhost); free(newhost); return str; }
static void init_freqtab(char *file) { char *p, *q, *dir, *file2; char line[1024], inc[1024]; char *text, *str; int size = 0, maxn, extra, currn; FILE *in1, *in2; static int v = 1; if (quiet) { v = 0; } /* YUCK */ dir = strdup(file); q = strrchr(dir, '/'); if (q) { *(q+1) = '\0'; } else { free(dir); dir = strdup("./"); } file2 = (char *) malloc(strlen(dir) + 1024 + 1); in1 = fopen(file, "r"); if (in1 == NULL) { rfbLog("error opening freqtab: %s\n", file); clean_up_exit(1); } if (v) fprintf(stderr, "loading frequencies from: %s\n", file); while (fgets(line, 1024, in1) != NULL) { char *lb; char line2[1024]; size += strlen(line); lb = lblanks(line); if (strstr(lb, "#include") == lb && sscanf(lb, "#include %s", inc) == 1) { char *q, *s = inc; if (s[0] == '"') { s++; } q = strrchr(s, '"'); if (q) { *q = '\0'; } sprintf(file2, "%s%s", dir, s); in2 = fopen(file2, "r"); if (in2 == NULL) { rfbLog("error opening freqtab include: %s %s\n", line, file2); clean_up_exit(1); } if (v) fprintf(stderr, "loading frequencies from: %s\n", file2); while (fgets(line2, 1024, in2) != NULL) { size += strlen(line2); } fclose(in2); } } fclose(in1); size = 4*(size + 10000); text = (char *) malloc(size); text[0] = '\0'; in1 = fopen(file, "r"); if (in1 == NULL) { rfbLog("error opening freqtab: %s\n", file); clean_up_exit(1); } while (fgets(line, 1024, in1) != NULL) { char *lb; char line2[1024]; lb = lblanks(line); if (lb[0] == '[') { strcat(text, lb); } else if (strstr(lb, "freq")) { strcat(text, lb); } else if (strstr(lb, "#include") == lb && sscanf(lb, "#include %s", inc) == 1) { char *lb2; char *q, *s = inc; if (s[0] == '"') { s++; } q = strrchr(s, '"'); if (q) { *q = '\0'; } sprintf(file2, "%s%s", dir, s); in2 = fopen(file2, "r"); if (in2 == NULL) { rfbLog("error opening freqtab include: %s %s\n", line, file2); clean_up_exit(1); } while (fgets(line2, 1024, in2) != NULL) { lb2 = lblanks(line2); if (lb2[0] == '[') { strcat(text, lb2); } else if (strstr(lb2, "freq")) { strcat(text, lb2); } if ((int) strlen(text) > size/2) { break; } } fclose(in2); } if ((int) strlen(text) > size/2) { break; } } fclose(in1); if (0) fprintf(stderr, "%s", text); str = strdup(text); p = strtok(str, "\n"); maxn = -1; extra = 0; while (p) { if (p[0] == '[') { int ok = 1; q = p+1; while (*q) { if (*q == ']') { break; } if (! isdigit((unsigned char) (*q))) { if (0) fprintf(stderr, "extra: %s\n", p); extra++; ok = 0; break; } q++; } if (ok) { int n; if (sscanf(p, "[%d]", &n) == 1) { if (n > maxn) { maxn = n; } if (0) fprintf(stderr, "maxn: %d %d\n", maxn, n); } } } p = strtok(NULL, "\n"); } free(str); str = strdup(text); p = strtok(str, "\n"); extra = 0; currn = 0; if (v) fprintf(stderr, "\nname\tstation\tfreq (KHz)\n"); while (p) { if (p[0] == '[') { int ok = 1; strncpy(line, p, 100); q = p+1; while (*q) { if (*q == ']') { break; } if (! isdigit((unsigned char) (*q))) { extra++; currn = maxn + extra; ok = 0; break; } q++; } if (ok) { int n; if (sscanf(p, "[%d]", &n) == 1) { currn = n; } } } if (strstr(p, "freq") && (q = strchr(p, '=')) != NULL) { int n; q = lblanks(q+1); if (sscanf(q, "%d", &n) == 1) { if (currn >= 0 && currn < CHANNEL_MAX) { if (v) fprintf(stderr, "%s\t%d\t%d\n", line, currn, n); custom_freq[currn] = (unsigned long) n; if (last_freq == 0) { last_freq = custom_freq[currn]; } } } } p = strtok(NULL, "\n"); } if (v) fprintf(stderr, "\n"); v = 0; free(str); free(text); free(dir); free(file2); }
static char *guess_via_v4l_info(char *dev, int *fd) { char *atparms, *cmd; char line[1024], tmp[] = "/tmp/x11vnc-tmp.XXXXXX"; FILE *out; int tmp_fd, len, rc, curr = 0; int g_w = 0, g_h = 0, g_b = 0, mask_rev = 0; char *g_fmt = NULL; if (*fd) {} /* v4l-info */ if (no_external_cmds || !cmd_ok("v4l-info")) { rfbLog("guess_via_v4l_info: cannot run external " "command: v4l-info\n"); return NULL; } if (strchr(dev, '\'')) { rfbLog("guess_via_v4l_info: bad dev string: %s\n", dev); return NULL; } tmp_fd = mkstemp(tmp); if (tmp_fd < 0) { return NULL; } len = strlen("v4l-info")+1+1+strlen(dev)+1+1+1+1+strlen(tmp)+1; cmd = (char *) malloc(len); rfbLog("guess_via_v4l_info running: v4l-info '%s'\n", dev); sprintf(cmd, "v4l-info '%s' > %s", dev, tmp); close(tmp_fd); close_exec_fds(); rc = system(cmd); if (rc != 0) { unlink(tmp); return NULL; } out = fopen(tmp, "r"); if (out == NULL) { unlink(tmp); return NULL; } curr = 0; while (fgets(line, 1024, out) != NULL) { char *lb = lblanks(line); if (strstr(line, "video capture") == line) { curr = C_VIDEO_CAPTURE; } else if (strstr(line, "picture") == line) { curr = C_PICTURE; } else if (strstr(line, "window") == line) { curr = C_WINDOW; } if (0) fprintf(stderr, "lb: %s", lb); if (curr == C_VIDEO_CAPTURE) { if (strstr(lb, "pixelformat ") == lb) { fprintf(stderr, "%s", line); } else if (strstr(lb, "fmt.pix.width ") == lb) { if (! g_w) { g_w = colon_n(line); } } else if (strstr(lb, "fmt.pix.height ") == lb) { if (! g_h) { g_h = colon_n(line); } } else if (strstr(lb, "fmt.pix.pixelformat ") == lb) { if (! g_fmt) { g_fmt = colon_tag(line); } } } else if (curr == C_PICTURE) { if (strstr(lb, "depth ") == lb) { if (! g_b) { g_b = colon_n(line); } } else if (strstr(lb, "palette ") == lb) { if (! g_fmt) { g_fmt = colon_str(line); } } } else if (curr == C_WINDOW) { if (strstr(lb, "width ") == lb) { if (! g_w) { g_w = colon_n(line); } } else if (strstr(lb, "height ") == lb) { if (! g_h) { g_h = colon_n(line); } } } } fclose(out); unlink(tmp); if (! g_w) { rfbLog("could not guess device width.\n"); return NULL; } rfbLog("guessed device width: %d\n", g_w); if (! g_h) { rfbLog("could not guess device height.\n"); return NULL; } rfbLog("guessed device height: %d\n", g_h); if (g_fmt) { rfbLog("guessed pixel fmt: %s\n", g_fmt); lookup_rgb(g_fmt, &g_b, &mask_rev); } if (! g_b) { rfbLog("could not guess device bpp.\n"); return NULL; } rfbLog("guessed device bpp: %d\n", g_b); atparms = (char *) malloc(100); sprintf(atparms, "%dx%dx%d", g_w, g_h, g_b); return atparms; }