int main(int argc, char *argv[]) { DIR *dir; struct dirent *entry; struct stat st; FTPWhoEntry *scanned_entry; int locked; int delete_file; const char *state; time_t now; int fodder; #ifndef NON_ROOT_FTP if (geteuid() != (uid_t) 0) { puts("You must be root to run this. Sorry."); return 1; } #endif if (argc < 0) { return -1; } if (closedesc_but1() < 0) { return -2; } #ifdef HAVE_SETLOCALE # ifdef LC_MESSAGES (void) setlocale(LC_MESSAGES, ""); # endif # ifdef LC_CTYPE (void) setlocale(LC_CTYPE, ""); # endif # ifdef LC_COLLATE (void) setlocale(LC_COLLATE, ""); # endif #endif fixlimits(); # ifdef SIGFPE signal(SIGFPE, sigfpe); # endif # ifdef SIGSEGV signal(SIGSEGV, sigsegv); # endif if (getenv("GATEWAY_INTERFACE") != NULL) { html_cgi = 1; output_header = html_output_header; output_line = html_output_line; output_footer = html_output_footer; } while ((fodder = getopt(argc, argv, "CchHnpsvwWx")) != -1) { switch(fodder) { case 'h' : help(); /* doesn't return */ case 'n' : case 'H' : dont_resolve_ip++; break; case 'C' : case 'c' : html_cgi++; case 'W' : html_raw++; case 'w' : output_header = html_output_header; output_line = html_output_line; output_footer = html_output_footer; break; case 'p' : output_header = plist_output_header; output_line = plist_output_line; output_footer = plist_output_footer; break; case 's' : output_header = shell_output_header; output_line = shell_output_line; output_footer = shell_output_footer; break; case 'x' : output_header = xml_output_header; output_line = xml_output_line; output_footer = xml_output_footer; break; case 'v' : verbose++; break; case '?' : help(); } } now = time(NULL); if (chdir(SCOREBOARD_PATH) != 0 || (dir = opendir(".")) == NULL) { fprintf(stderr, "Unable to open the ftpwho scoreboard.\n" "Make sure that the [" SCOREBOARD_PATH "/] directory exists,\n" "Or wait until a client connects, so that it gets\n" "automatically created. This message doesn't mean that your\n" "server didn't start properly. It probably just means that\n" "you are running it with ftpwho for the first time.\n"); return -1; } lock.l_whence = SEEK_SET; lock.l_start = (off_t) 0; lock.l_len = (off_t) 0; lock.l_pid = getpid(); output_header(); while ((entry = readdir(dir)) != NULL) { mmap_fd = -1; locked = 0; delete_file = 0; scanned_entry = NULL; if (strncmp(entry->d_name, SCOREBOARD_PREFIX, sizeof SCOREBOARD_PREFIX - 1U) != 0) { goto nextone; } if ((mmap_fd = open(entry->d_name, O_RDWR | O_NOFOLLOW)) == -1) { goto nextone; } if (fstat(mmap_fd, &st) != 0 || !S_ISREG(st.st_mode) || (st.st_mode & 0600) != 0600 || st.st_size != (off_t) sizeof (FTPWhoEntry) || #ifdef NON_ROOT_FTP st.st_uid != geteuid() #else st.st_uid != (uid_t) 0 #endif ) { goto nextone; } ftpwho_lock(); locked++; if ((scanned_entry = (FTPWhoEntry *) mmap(NULL, sizeof (FTPWhoEntry), PROT_READ, MAP_SHARED | MAP_FILE, mmap_fd, (off_t) 0)) == (void *) MAP_FAILED) { goto nextone; } if (checkproc(scanned_entry->pid) == 0) { /* still in the scoreboard, but no more process */ delete_file++; goto nextone; } if (scanned_entry->state != FTPWHO_STATE_FREE) { unsigned long since; unsigned long xfer_since; char local_port[NI_MAXSERV]; char local_hbuf[NI_MAXHOST]; char hbuf[NI_MAXHOST]; switch (scanned_entry->state) { case FTPWHO_STATE_IDLE : state = "IDLE"; break; case FTPWHO_STATE_DOWNLOAD : state = " DL "; break; case FTPWHO_STATE_UPLOAD : state = " UL "; break; default : state = "ERR!"; } if (scanned_entry->date < now) { since = (unsigned long) (now - scanned_entry->date); } else { since = 0UL; } if (scanned_entry->xfer_date > (time_t) 0 && scanned_entry->xfer_date < now) { xfer_since = (unsigned long) (now - scanned_entry->xfer_date); } else { xfer_since = 0UL; } for (;;) { int eai; if ((eai = getnameinfo ((struct sockaddr *) &scanned_entry->addr, STORAGE_LEN(scanned_entry->addr), hbuf, sizeof hbuf, NULL, (size_t) 0U, dont_resolve_ip != 0 ? NI_NUMERICHOST : 0)) == 0) { break; } #if defined(EAI_NONAME) && defined(EAI_SYSTEM) if ((eai == EAI_NONAME || eai == EAI_SYSTEM) && dont_resolve_ip == 0 && getnameinfo ((struct sockaddr *) &scanned_entry->addr, STORAGE_LEN(scanned_entry->addr), hbuf, sizeof hbuf, NULL, (size_t) 0U, NI_NUMERICHOST) == 0) { break; } #endif goto nextone; } for (;;) { int eai; if ((eai = getnameinfo ((struct sockaddr *) &scanned_entry->local_addr, STORAGE_LEN(scanned_entry->addr), local_hbuf, sizeof local_hbuf, local_port, sizeof local_port, dont_resolve_ip != 0 ? (NI_NUMERICHOST | NI_NUMERICSERV) : NI_NUMERICSERV)) == 0) { break; } #if defined(EAI_NONAME) && defined(EAI_SYSTEM) if ((eai == EAI_NONAME || eai == EAI_SYSTEM) && dont_resolve_ip == 0 && getnameinfo ((struct sockaddr *) &scanned_entry->local_addr, STORAGE_LEN(scanned_entry->addr), local_hbuf, sizeof local_hbuf, local_port, sizeof local_port, NI_NUMERICHOST | NI_NUMERICSERV) == 0) { break; } #endif goto nextone; } output_line(scanned_entry->pid, scanned_entry->account, since, xfer_since, state, scanned_entry->filename, hbuf, local_hbuf, local_port, (scanned_entry->restartat <= scanned_entry->download_current_size) ? scanned_entry->restartat : (off_t) 0, (scanned_entry->state == FTPWHO_STATE_DOWNLOAD) ? scanned_entry->download_total_size : (off_t) 0, (scanned_entry->state == FTPWHO_STATE_DOWNLOAD || scanned_entry->state == FTPWHO_STATE_UPLOAD) ? scanned_entry->download_current_size : (off_t) 0); } nextone: if (locked != 0 && mmap_fd != -1) { ftpwho_unlock(); } if (scanned_entry != NULL) { (void) munmap((void *) scanned_entry, sizeof (FTPWhoEntry)); } if (mmap_fd != -1) { close(mmap_fd); } if (delete_file != 0) { unlink(entry->d_name); } } output_footer(); return 0; }
static void test_overcommit(void) { void *addr = NULL, *shmaddr = NULL; if (opt_shmid) { shmid = SAFE_SHMGET(key, (length / 2 * hugepagesize), SHM_HUGETLB | IPC_CREAT | SHM_R | SHM_W); } else { fd = SAFE_OPEN(TEST_FILE, O_CREAT | O_RDWR, 0755); addr = SAFE_MMAP(ADDR, (length / 2 * hugepagesize), PROTECTION, FLAGS, fd, 0); } if (opt_sysfs) { tst_res(TINFO, "check sysfs before allocation."); if (checksys(path_sys_sz_huge, "HugePages_Total", length / 2)) return; if (checksys(path_sys_sz_free, "HugePages_Free", length / 2)) return; if (checksys(path_sys_sz_surp, "HugePages_Surp", length / 2 - size)) return; if (checksys(path_sys_sz_resv, "HugePages_Rsvd", length / 2)) return; } else { tst_res(TINFO, "check /proc/meminfo before allocation."); if (checkproc(SAFE_READ_MEMINFO("HugePages_Total:"), "HugePages_Total", length / 2)) return; if (checkproc(SAFE_READ_MEMINFO("HugePages_Free:"), "HugePages_Free", length / 2)) return; if (checkproc(SAFE_READ_MEMINFO("HugePages_Surp:"), "HugePages_Surp", length / 2 - size)) return; if (checkproc(SAFE_READ_MEMINFO("HugePages_Rsvd:"), "HugePages_Rsvd", length / 2)) return; } if (opt_shmid) { tst_res(TINFO, "shmid: 0x%x", shmid); shmaddr = SAFE_SHMAT(shmid, ADDR, SHMAT_FLAGS); check_wr_bytes(shmaddr); } else { check_wr_bytes(addr); } if (opt_sysfs) { tst_res(TINFO, "check sysfs."); if (checksys(path_sys_sz_huge, "HugePages_Total", length / 2)) return; if (checksys(path_sys_sz_free, "HugePages_Free", 0)) return; if (checksys(path_sys_sz_surp, "HugePages_Surp", length / 2 - size)) return; if (checksys(path_sys_sz_resv, "HugePages_Rsvd", 0)) return; } else { tst_res(TINFO, "check /proc/meminfo."); if (checkproc(SAFE_READ_MEMINFO("HugePages_Total:"), "HugePages_Total", length / 2)) return; if (checkproc(SAFE_READ_MEMINFO("HugePages_Free:"), "HugePages_Free", 0)) return; if (checkproc(SAFE_READ_MEMINFO("HugePages_Surp:"), "HugePages_Surp", length / 2 - size)) return; if (checkproc(SAFE_READ_MEMINFO("HugePages_Rsvd:"), "HugePages_Rsvd", 0)) return; } if (opt_shmid) { SAFE_SHMDT(shmaddr); SAFE_SHMCTL(shmid, IPC_RMID, NULL); } else { SAFE_MUNMAP(addr, (length / 2 * hugepagesize)); SAFE_CLOSE(fd); SAFE_UNLINK(TEST_FILE); } tst_res(TPASS, "hugepages overcommit test pass"); }
void docmd(void) { int c; struct ww *w; char out = 0; while (!out && !quit) { if ((c = wwgetc()) < 0) { if (terse) wwsetcursor(0, 0); else { wwputs("Command: ", cmdwin); wwcurtowin(cmdwin); } do wwiomux(); while ((c = wwgetc()) < 0); } if (!terse) wwputc('\n', cmdwin); switch (c) { default: if (c != escapec) break; case 'h': case 'j': case 'k': case 'l': case 'y': case 'p': case ctrl('y'): case ctrl('e'): case ctrl('u'): case ctrl('d'): case ctrl('b'): case ctrl('f'): case ctrl('s'): case ctrl('q'): case ctrl('['): if (selwin == 0) { error("No window."); continue; } } switch (c) { case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if ((w = window[c - '1']) == 0) { error("%c: No such window.", c); break; } setselwin(w); if (checkproc(selwin) >= 0) out = 1; break; case '%': if ((w = getwin()) != 0) setselwin(w); break; case ctrl('^'): if (lastselwin != 0) { setselwin(lastselwin); if (checkproc(selwin) >= 0) out = 1; } else error("No previous window."); break; case 'c': if ((w = getwin()) != 0) closewin(w); break; case 'w': c_window(); break; case 'm': if ((w = getwin()) != 0) c_move(w); break; case 'M': if ((w = getwin()) != 0) movewin(w, w->ww_alt.t, w->ww_alt.l); break; case 's': if ((w = getwin()) != 0) c_size(w); break; case 'S': if ((w = getwin()) != 0) sizewin(w, w->ww_alt.nr, w->ww_alt.nc); break; case 'y': c_yank(); break; case 'p': c_put(); break; case ':': c_colon(); break; case 'h': (void) wwwrite(selwin, "\b", 1); break; case 'j': (void) wwwrite(selwin, "\n", 1); break; case 'k': (void) wwwrite(selwin, "\033A", 2); break; case 'l': (void) wwwrite(selwin, "\033C", 2); break; case ctrl('e'): wwscroll(selwin, 1); break; case ctrl('y'): wwscroll(selwin, -1); break; case ctrl('d'): wwscroll(selwin, selwin->ww_w.nr / 2); break; case ctrl('u'): wwscroll(selwin, - selwin->ww_w.nr / 2); break; case ctrl('f'): wwscroll(selwin, selwin->ww_w.nr); break; case ctrl('b'): wwscroll(selwin, - selwin->ww_w.nr); break; case ctrl('s'): stopwin(selwin); break; case ctrl('q'): startwin(selwin); break; case ctrl('l'): wwredraw(); break; case '?': c_help(); break; case ctrl('['): if (checkproc(selwin) >= 0) out = 1; break; case ctrl('z'): wwsuspend(); break; case 'q': c_quit(); break; /* debugging stuff */ case '&': if (debug) { c_debug(); break; } default: if (c == escapec) { if (checkproc(selwin) >= 0) { (void) write(selwin->ww_pty, &escapec, 1); out = 1; } } else { if (!terse) wwbell(); error("Type ? for help."); } } } if (!quit) setcmd(0); }
static void overcommit(void) { void *addr = NULL, *shmaddr = NULL; int fd = -1, key = -1; char s[BUFSIZ]; FILE *fp; if (shmid != -1) { /* Use /proc/meminfo to generate an IPC key. */ key = ftok(PATH_MEMINFO, strlen(PATH_MEMINFO)); if (key == -1) tst_brkm(TBROK|TERRNO, cleanup, "ftok"); shmid = shmget(key, (long)(length / 2 * hugepagesize), SHM_HUGETLB | IPC_CREAT | SHM_R | SHM_W); if (shmid == -1) tst_brkm(TBROK|TERRNO, cleanup, "shmget"); } else { /* XXX (garrcoop): memory leak. */ snprintf(s, BUFSIZ, "%s/hugemmap05/file", get_tst_tmpdir()); fd = open(s, O_CREAT | O_RDWR, 0755); if (fd == -1) tst_brkm(TBROK|TERRNO, cleanup, "open"); addr = mmap(ADDR, (long)(length / 2 * hugepagesize), PROTECTION, FLAGS, fd, 0); if (addr == MAP_FAILED) tst_brkm(TBROK|TERRNO, cleanup, "mmap"); } if (opt_sysfs) { tst_resm(TINFO, "check sysfs before allocation."); if (checksys(path_sys_sz_huge, "HugePages_Total", length / 2) != 0) return; if (checksys(path_sys_sz_free, "HugePages_Free", length / 2) != 0) return; if (checksys(path_sys_sz_surp, "HugePages_Surp", length / 2 - size) != 0) return; if (checksys(path_sys_sz_resv, "HugePages_Rsvd", length / 2) != 0) return; } else { tst_resm(TINFO, "check /proc/meminfo before allocation."); fp = fopen(PATH_MEMINFO, "r"); if (fp == NULL) tst_brkm(TBROK|TERRNO, cleanup, "fopen"); if (checkproc(fp, "HugePages_Total", length / 2) != 0) return; if (checkproc(fp, "HugePages_Free", length / 2 ) != 0) return; if (checkproc(fp, "HugePages_Surp", length / 2 - size) != 0) return; if (checkproc(fp, "HugePages_Rsvd", length / 2) != 0) return; fclose(fp); } if (shmid != -1) { tst_resm(TINFO, "shmid: 0x%x", shmid); shmaddr = shmat(shmid, ADDR, SHMAT_FLAGS); if (shmaddr == (void *)-1) tst_brkm(TBROK|TERRNO, cleanup, "shmat"); write_bytes(shmaddr); read_bytes(shmaddr); } else { write_bytes(addr); read_bytes(addr); } if (opt_sysfs) { tst_resm(TINFO, "check sysfs."); if (checksys(path_sys_sz_huge, "HugePages_Total", length / 2) != 0) return; if (checksys(path_sys_sz_free, "HugePages_Free", 0) != 0) return; if (checksys(path_sys_sz_surp, "HugePages_Surp", length / 2 - size) != 0) return; if (checksys(path_sys_sz_resv, "HugePages_Rsvd", 0) != 0) return; } else { tst_resm(TINFO, "check /proc/meminfo."); fp = fopen(PATH_MEMINFO, "r"); if (fp == NULL) tst_brkm(TBROK|TERRNO, cleanup, "fopen"); if (checkproc(fp, "HugePages_Total", length / 2) != 0) return; if (checkproc(fp, "HugePages_Free", 0) != 0) return; if (checkproc(fp, "HugePages_Surp", length / 2 - size) != 0) return; if (checkproc(fp, "HugePages_Rsvd", 0) != 0) return; fclose(fp); } if (shmid != -1) { if (shmdt(shmaddr) != 0) tst_brkm(TBROK|TERRNO, cleanup, "shmdt"); } else { munmap(addr, (long)(length / 2 * hugepagesize)); close(fd); unlink(s); } }