void refresh_command_line(t_char **list) { t_char *temp; t_char **activechar; int i; char *tempstr; cursor_move_left(*(getcurpos())); tputs(tgetstr("cd", NULL), 1, t_write); activechar = getactivechar(); ft_putstr_fd("$> ", *(gettty())); if (*list) { tempstr = char_to_str((*list)->next); *(getcurpos()) = 3 + ft_strlen(tempstr); ft_putstr_fd(tempstr, *(gettty())); ft_memdel((void **)&tempstr); temp = (*list)->next; i = 3; while (temp && temp != *activechar) { i++; temp = temp->next; } cursor_move_left(*(getcurpos()) - i); } }
void tty_init_nhwindows() { int wid, hgt; /* * Remember tty modes, to be restored on exit. * * gettty() must be called before tty_startup() * due to ordering of LI/CO settings * tty_startup() must be called before initoptions() * due to ordering of graphics settings */ #if defined(UNIX) || defined(VMS) setbuf(stdout,obuf); #endif gettty(); /* to port dependant tty setup */ tty_startup(&wid, &hgt); setftty(); /* calls start_screen */ /* set up tty descriptor */ ttyDisplay = (struct DisplayDesc*) alloc(sizeof(struct DisplayDesc)); ttyDisplay->toplin = 0; ttyDisplay->rows = hgt; ttyDisplay->cols = wid; ttyDisplay->curx = ttyDisplay->cury = 0; ttyDisplay->inmore = ttyDisplay->inread = ttyDisplay->intr = 0; #ifdef TEXTCOLOR ttyDisplay->color = NO_COLOR; #endif ttyDisplay->attrs = 0; /* set up the default windows */ BASE_WINDOW = tty_create_nhwindow(NHW_BASE); wins[BASE_WINDOW]->active = 1; ttyDisplay->lastwin = WIN_ERR; #if defined(SIGWINCH) && defined(CLIPPING) (void) signal(SIGWINCH, winch); #endif tty_clear_nhwindow(BASE_WINDOW); tty_putstr(BASE_WINDOW, 0, ""); tty_putstr(BASE_WINDOW, 0, "NetHack, Copyright 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993"); tty_putstr(BASE_WINDOW, 0, " By Stichting Mathematisch Centrum and M. Stephenson."); tty_putstr(BASE_WINDOW, 0, " See license for details."); tty_putstr(BASE_WINDOW, 0, ""); tty_display_nhwindow(BASE_WINDOW, FALSE); }
char printProperNewline(int fd) { char ttyType[15]; gettty(ttyType); if(strcmp(ttyType, "/dev/tty0") == 0) { // Need this for qemu write(fd, "\r", 1); } write(fd, "\n", 1); }
/* ARGSUSED */ void tstpcont(int sig) { int save_errno = errno; if (sig == SIGTSTP) { signal(SIGCONT, tstpcont); gettty(&ttyedit); settty(&ttysaved); } else { signal(SIGTSTP, tstpcont); settty(&ttyedit); } signal(sig, SIG_DFL); kill(0, sig); errno = save_errno; }
/* This cannot be part of hack.tty.c (as it was earlier) since on some systems (e.g. MUNIX) the include files <termio.h> and <sgtty.h> define the same constants, and the C preprocessor complains. */ #include <stdio.h> #include "config.h" #ifdef BSD #include <sgtty.h> struct ltchars ltc, ltc0; #else #include <termio.h> /* also includes part of <sgtty.h> */ struct termio termio; #endif BSD getioctls() { #ifdef BSD (void) ioctl(fileno(stdin), TIOCGLTC, (char *) <c); (void) ioctl(fileno(stdin), TIOCSLTC, (char *) <c0); #else (void) ioctl(fileno(stdin), TCGETA, &termio); #endif BSD } setioctls() { #ifdef BSD (void) ioctl(fileno(stdin), TIOCSLTC, (char *) <c); #else (void) ioctl(fileno(stdin), TCSETA, &termio); #endif BSD } #ifdef SUSPEND /* implies BSD */ dosuspend() { #include <signal.h> #ifdef SIGTSTP if(signal(SIGTSTP, SIG_IGN) == SIG_DFL) { settty((char *) 0); (void) signal(SIGTSTP, SIG_DFL); (void) kill(0, SIGTSTP); gettty(); setftty(); docrt(); } else { pline("I don't think your shell has job control."); } #else SIGTSTP pline("Sorry, it seems we have no SIGTSTP here. Try ! or S."); #endif SIGTSTP return(0); }
int main(int argc, char **argv, char **envp) { t_char *list; t_env **env; (void)argc; (void)argv; list = NULL; char_add(&list, char_new('-')); *(getactivelist()) = &list; env = ft_getenv(); *env = ft_load_env(envp); (ft_saved_env())->home = ft_strdup(get_env_value("HOME")); term_initiate(); ft_putstr_fd("$> ", *(gettty())); *(getcurpos()) = 3; show_prompt(&list, envp); return (0); }
int child(int wt) { int status; int f; char *home; gid_t gid; f = fork(); if(f == 0){ /* child */ settty((char *) 0); /* also calls end_screen() */ /* revoke privs */ gid = getgid(); setresgid(gid, gid, gid); #ifdef CHDIR home = getenv("HOME"); if (home == NULL || *home == '\0') home = "/"; (void) chdir(home); #endif /* CHDIR */ return(1); } if(f == -1) { /* cannot fork */ pline("Fork failed. Try again."); return(0); } /* fork succeeded; wait for child to exit */ (void) signal(SIGINT,SIG_IGN); (void) signal(SIGQUIT,SIG_IGN); (void) wait(&status); gettty(); setftty(); (void) signal(SIGINT,done1); #ifdef WIZARD if(wizard) (void) signal(SIGQUIT,SIG_DFL); #endif /* WIZARD */ if(wt) getret(); docrt(); return(0); }
void PortaSerial::buscaDispositivo(const char *comando, char respEsperada, bool loop) { char msg[255]; char resp[255]; bool conexao = false; char porta[100]; int ret; int pos = 0; string dir = string("/dev"); vector<string> files = vector<string>(); while(!conexao) { files.clear(); if(conectado) fecha(); while(files.size() <= 0) { gettty(dir,files); } if(pos == files.size()) { pos = 0; } sprintf(porta, "/dev/%s", files[pos++].c_str()); setPort(porta); abre(baud, canonical, databits, parity, startbit, stopbit); sprintf(msg, "%s\0", comando); ret = envia(msg, resp); if(resp[0] == respEsperada || !loop) conexao = true; } if(resp[0] != respEsperada) { conectado = false; } }
bool child(bool wt) { int status; int f; f = fork(); if (f == 0) { /* child */ settty(NULL); /* also calls end_screen() */ /* revoke */ setgid(getgid()); #ifdef CHDIR chdir(getenv("HOME")); #endif /* CHDIR */ return (1); } if (f == -1) { /* cannot fork */ pline("Fork failed. Try again."); return (0); } /* fork succeeded; wait for child to exit */ signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); wait(&status); gettty(); setftty(); signal(SIGINT, done1); #ifdef WIZARD if (wizard) signal(SIGQUIT, SIG_DFL); #endif /* WIZARD */ if (wt) getret(); docrt(); return (0); }
// more.c must print one page, then accept user input for controls // if the user presses space, print an entire page // if the user presses enter, print a line // if the user presses q, quit more.c int main(int argc, char *argv[]) { char c, userInput, tty[64]; int fd, read, i, j; //If we only have "more" as our argument, then we are probably in a pipe, let's handle it // // cat f | more // |_____________| // | // v // stdin = cat f; //we need to read from the terminal AND from cat f // fd = dup(0); //first you need to duplicate your stdin // close(0) // CLOSE 0 so it becomes free on fd table // gettty(tty) //we don't know our tty name, get it // open(tty, 0) //Open it for read, since we closed 0, it will take the place of stdin // // if (argc == 1) { //Let's say we got passed cat f | more, cat f will be our stdin (0) fd = dup(0); //DUPLICATE "cat f" into our file decriptor close(0); //close "cat f" so we can replace it with our terminal gettty(tty); //We need to know what our tty is, get it from our PROC.tty[] open(tty, 0); //Open it for read or "in", since we still need to accept user input } //Otherwise, we have a a file input, and we are probably not piping else { fd = open(argv[1], 0); //Open the file for reading } //Just in case we screw up our fd if (fd < 0) { printf("more: cannot find the file %s\n", argv[1]); return -1; } //When we get here we should have a valid fd open, and be ready to print stuff to the screen while (1) { PrintPage(fd); while (1) { userInput = getc(); switch(userInput) { case '\r': //If we get an enter we need to print just a line and move the screen up PrintLine(fd); break; case ' ': //If we get a space character, print the entire screen. PrintPage(fd); break; case 'q': //If we get a 'q' the user wants to end more printf("\n"); printf("more: quitting...\n\n"); return 0; break; default: break; } } } }
void get_ps_data(void) { ps_ldata_t *ps_last = PS_LNULL; ps_ldata_t *ps_head = PS_LNULL; ps_ldata_t *psp; ps_data_t *pstp; static char *usrname; int i = 0; DIR *dirp; struct dirent *dentp; char pname[MAXNAMELEN]; int pdlen; char *gettty(); if (pstable != PS_NULL) { /* Don't run ps unless we need to */ if ((cache_now - ps_cache_time) <= cache_lifetime) return; free(pstable); } pstable_lines = 0; ps_cache_time = cache_now; /* * Determine root path for remote machine. */ if (!readata()) { /* get data from psfile */ call_ftw_for_dev(); wrdata(); } /* * Determine which processes to print info about by searching * the /proc directory and looking at each process. */ if ((dirp = opendir(procdir)) == NULL) { (void) SYSLOG0("Cannot open PROC directory\n"); return; } (void) strcpy(pname, procdir); pdlen = strlen(pname); pname[pdlen++] = '/'; /* for each active process --- */ while (dentp = readdir(dirp)) { int procfd; if (dentp->d_name[0] == '.') /* skip . and .. */ continue; (void) strcpy(pname + pdlen, dentp->d_name); retry: if ((procfd = open(pname, O_RDONLY)) == -1) continue; /* * Get the info structure for the process and close quickly. */ if (ioctl(procfd, PIOCPSINFO, (char *)&info) == -1) { int saverr = errno; (void) close(procfd); if (saverr == EAGAIN) goto retry; if (saverr != ENOENT) (void) SYSLOG2("PIOCPSINFO on %s: %s\n", pname, strerror(saverr)); continue; } (void) close(procfd); if ((psp = (ps_ldata_t *)malloc(sizeof (ps_ldata_t))) == PS_LNULL) break; memset((char *)psp, 0, sizeof (ps_ldata_t)); psp->pdata.uid = info.pr_uid; psp->pdata.pid = info.pr_pid; psp->pdata.ppid = info.pr_ppid; psp->pdata.sz = info.pr_size; if (info.pr_wchan) sprintf(psp->pdata.wchan, "%9x", info.pr_wchan); else strcpy(psp->pdata.wchan, " "); memset(&psp->pdata.stat[0], 0, STAT_SZ+1); if (info.pr_sname) psp->pdata.stat[0] = info.pr_sname; i = 0; strcpy(psp->pdata.tty, (char *)gettty(&i)); psp->pdata.cpu = info.pr_time.tv_sec; strcpy(psp->pdata.cmd, info.pr_fname); if ((usrname = (get_usr_name(psp->pdata.uid))) != NULL) strncpy(psp->pdata.usrname, usrname, USRNM_SZ); else { free(psp); continue; } psp->pdata.usrname[USRNM_SZ] = '\0'; pstable_lines++; if (ps_last == PS_LNULL) ps_head = psp; else ps_last->link = psp; ps_last = psp; } (void) closedir(dirp); if ((pstable = (ps_data_t *)malloc(pstable_lines * sizeof (ps_data_t))) == PS_NULL) { clean_ps(ps_head); return; } for (pstp = pstable, psp = ps_head; psp != PS_LNULL; pstp++, psp = psp->link) { memcpy((char *)pstp, (char *)&(psp->pdata), sizeof (ps_data_t)); } clean_ps(ps_head); qsort(pstable, pstable_lines, sizeof (ps_data_t), (int (*)())pscomp); }
int main(int argc, char *argv[]) { int fd; #ifdef CHDIR char *dir; #endif hname = argv[0]; hackpid = getpid(); #ifdef CHDIR /* otherwise no chdir() */ /* * See if we must change directory to the playground. * (Perhaps hack runs suid and playground is inaccessible * for the player.) * The environment variable HACKDIR is overridden by a * -d command line option (must be the first option given) */ dir = getenv("HACKDIR"); if (argc > 1 && !strncmp(argv[1], "-d", 2)) { argc--; argv++; dir = argv[0] + 2; if (*dir == '=' || *dir == ':') dir++; if (!*dir && argc > 1) { argc--; argv++; dir = argv[0]; } if (!*dir) error("Flag -d must be followed by a directory name."); } #endif /* * Who am i? Algorithm: 1. Use name as specified in HACKOPTIONS * 2. Use $USER or $LOGNAME (if 1. fails) * 3. Use getlogin() (if 2. fails) * The resulting name is overridden by command line options. * If everything fails, or if the resulting name is some generic * account like "games", "play", "player", "hack" then eventually * we'll ask him. * Note that we trust him here; it is possible to play under * somebody else's name. */ { char *s; initoptions(); if (!*plname && (s = getenv("USER"))) strncpy(plname, s, sizeof(plname) - 1); if (!*plname && (s = getenv("LOGNAME"))) strncpy(plname, s, sizeof(plname) - 1); if (!*plname && (s = getlogin())) strncpy(plname, s, sizeof(plname) - 1); } /* * Now we know the directory containing 'record' and * may do a prscore(). */ if (argc > 1 && !strncmp(argv[1], "-s", 2)) { #ifdef CHDIR chdirx(dir, 0); #endif prscore(argc, argv); exit(0); } /* * It seems he really wants to play. * Remember tty modes, to be restored on exit. */ gettty(); setbuf(stdout, obuf); umask(007); setrandom(); startup(); cls(); u.uhp = 1; /* prevent RIP on early quits */ u.ux = FAR; /* prevent nscr() */ signal(SIGHUP, hangup); /* * Find the creation date of this game, * so as to avoid restoring outdated savefiles. */ gethdate(hname); /* * We cannot do chdir earlier, otherwise gethdate will fail. */ #ifdef CHDIR chdirx(dir, 1); #endif /* * Process options. */ while (argc > 1 && argv[1][0] == '-') { argv++; argc--; switch (argv[0][1]) { #ifdef WIZARD case 'D': wizard = TRUE; break; #endif #ifdef NEWS case 'n': flags.nonews = TRUE; break; #endif case 'u': if (argv[0][2]) strncpy(plname, argv[0] + 2, sizeof(plname) - 1); else if (argc > 1) { argc--; argv++; strncpy(plname, argv[0], sizeof(plname) - 1); } else printf("Player name expected after -u\n"); break; default: /* allow -T for Tourist, etc. */ strncpy(pl_character, argv[0] + 1, sizeof(pl_character) - 1); } } if (argc > 1) locknum = atoi(argv[1]); #ifdef MAX_NR_OF_PLAYERS if (!locknum || locknum > MAX_NR_OF_PLAYERS) locknum = MAX_NR_OF_PLAYERS; #endif #ifdef DEF_PAGER if (!(catmore = getenv("HACKPAGER")) && !(catmore = getenv("PAGER"))) catmore = DEF_PAGER; #endif #ifdef MAIL getmailstatus(); #endif #ifdef WIZARD if (wizard) strcpy(plname, "wizard"); else #endif if (!*plname || !strncmp(plname, "player", 4) || !strncmp(plname, "games", 4)) askname(); plnamesuffix(); /* strip suffix from name; calls askname() */ /* again if suffix was whole name */ /* accepts any suffix */ #ifdef WIZARD if (!wizard) { #endif /* * check for multiple games under the same name * (if !locknum) or check max nr of players (otherwise) */ signal(SIGQUIT, SIG_IGN); signal(SIGINT, SIG_IGN); if (!locknum) strcpy(lock, plname); getlock(); /* sets lock if locknum != 0 */ #ifdef WIZARD } else { char *sfoo; strcpy(lock, plname); if ((sfoo = getenv("MAGIC"))) while (*sfoo) { switch (*sfoo++) { case 'n': srandom(*sfoo++); break; } } if ((sfoo = getenv("GENOCIDED")) != NULL) { if (*sfoo == '!') { struct permonst *pm = mons; char *gp = genocided; while (pm < mons + CMNUM + 2) { if (!strchr(sfoo, pm->mlet)) *gp++ = pm->mlet; pm++; } *gp = 0; } else strncpy(genocided, sfoo, sizeof(genocided) - 1); strcpy(fut_geno, genocided); } } #endif setftty(); sprintf(SAVEF, "save/%d%s", getuid(), plname); regularize(SAVEF + 5); /* avoid . or / in name */ if ((fd = open(SAVEF, O_RDONLY)) >= 0 && (uptodate(fd) || unlink(SAVEF) == 666)) { signal(SIGINT, done1); pline("Restoring old save file..."); fflush(stdout); if (!dorecover(fd)) goto not_recovered; pline("Hello %s, welcome to %s!", plname, gamename); flags.move = 0; } else { not_recovered: fobj = fcobj = invent = 0; fmon = fallen_down = 0; ftrap = 0; fgold = 0; flags.ident = 1; init_objects(); u_init(); signal(SIGINT, done1); mklev(); u.ux = xupstair; u.uy = yupstair; inshop(); setsee(); flags.botlx = 1; makedog(); { struct monst *mtmp; if ((mtmp = m_at(u.ux, u.uy)) != NULL) mnexto(mtmp); /* riv05!a3 */ } seemons(); #ifdef NEWS if (flags.nonews || !readnews()) /* after reading news we did docrt() already */ #endif docrt(); /* give welcome message before pickup messages */ pline("Hello %s, welcome to %s!", plname, gamename); pickup(1); read_engr_at(u.ux, u.uy); flags.move = 1; } flags.moonphase = phase_of_the_moon(); if (flags.moonphase == FULL_MOON) { pline("You are lucky! Full moon tonight."); u.uluck++; } else if (flags.moonphase == NEW_MOON) pline("Be careful! New moon tonight."); initrack(); for (;;) { if (flags.move) { /* actual time passed */ settrack(); if (moves % 2 == 0 || (!(Fast & ~INTRINSIC) && (!Fast || rn2(3)))) { movemon(); if (!rn2(70)) makemon(NULL, 0, 0); } if (Glib) glibr(); p_timeout(); ++moves; if (flags.time) flags.botl = 1; if (u.uhp < 1) { pline("You die..."); done("died"); } if (u.uhp * 10 < u.uhpmax && moves - wailmsg > 50) { wailmsg = moves; if (u.uhp == 1) pline("You hear the wailing of the Banshee..."); else pline("You hear the howling of the CwnAnnwn..."); } if (u.uhp < u.uhpmax) { if (u.ulevel > 9) { if (Regeneration || !(moves % 3)) { flags.botl = 1; u.uhp += rnd((int)u.ulevel - 9); if (u.uhp > u.uhpmax) u.uhp = u.uhpmax; } } else if (Regeneration || (!(moves % (22 - u.ulevel * 2)))) { flags.botl = 1; u.uhp++; } } if (Teleportation && !rn2(85)) tele(); if (Searching && multi >= 0) dosearch(); gethungry(); invault(); amulet(); } if (multi < 0) { if (!++multi) { pline("%s", nomovemsg ? nomovemsg : "You can move again."); nomovemsg = 0; if (afternmv) (*afternmv)(); afternmv = NULL; } } find_ac(); #ifndef QUEST if (!flags.mv || Blind) #endif { seeobjs(); seemons(); nscr(); } if (flags.botl || flags.botlx) bot(); flags.move = 1; if (multi >= 0 && occupation) { if (monster_nearby()) stop_occupation(); else if ((*occupation)() == 0) occupation = NULL; continue; } if (multi > 0) { #ifdef QUEST if (flags.run >= 4) finddir(); #endif lookaround(); if (!multi) { /* lookaround may clear multi */ flags.move = 0; continue; } if (flags.mv) { if (multi < COLNO && !--multi) flags.mv = flags.run = 0; domove(); } else { --multi; rhack(save_cm); } } else if (multi == 0) { #ifdef MAIL ckmailstatus(); #endif rhack(NULL); } if (multi && multi % 7 == 0) fflush(stdout); } }
/* recursivePipe(char *, int) takes a command and index to knwo what command we are on */ int recursivePipe(char * cmd, int index){ /* cmd = more */ int pid, fd, copy; int ttyfd; char tty[64]; if(index < 1){ printf("index is -1... RETURN\n"); return; } pipe(pd); // First fork a new child to stage the WRITING proc printf("forking to %s from %s\n", cmd, pipeCmds[index]); pid = fork(); if(pid == 0){ // Child close(pd[0]); // Close the child's read //if(index != (numCmds-2)){ // If we are not on the last command, make stdout be the pipe dup2(pd[1], 1); // Place the WRITE end of the pipe into stdout so anything coming from the pipe close(pd[1]); //} copy = dup(1); close(1); gettty(tty); ttyfd = open(tty, O_WRONLY); if(ttyfd == 1){ printf("exec(%s) from %s\n", cmd, pipeCmds[index]); close(1); dup(copy); close(copy); } /*copy = dup(0); close(0); gettty(tty); ttyfd = open(tty, O_RDONLY); if(ttyfd == 0){ getc(); close(0); dup(copy); close(copy); }*/ exec(cmd); }else{ // Parent printf("in parent: %s[%d]\n", pipeCmds[index], index); close(pd[1]); // Close the parent's write since more doesn't have to write //if(index != 0){ // If we are not on the first command, make stdin be the pipe dup2(pd[0], 0); // Place the READ end of pipe into stdin so that more's stdin comes from the pipe close(pd[0]); //} printf("lets recurse!: %s[%d]\n", pipeCmds[index], index); // if(index > 0){ recursivePipe(pipeCmds[index-2], index-1); // This will set up all other procs too with correct pipes //pid = wait(getpid()); // } printf("done recurse!: %s[%d]\n", pipeCmds[index], index); } }
/* * setupvt100() * Subroutine to set up terminal in correct mode for game * Attributes off, clear screen, set scrolling region, set tty mode */ setupvt100 () { clear(); setscroll(); gettty(); }
/* * Print info about the process. */ static int prcom(int found, psinfo_t *psinfo, char *psargs) { char *cp; char *tp; char *psa; long tm; int i, wcnt, length; wchar_t wchar; struct tty *ttyp; /* * If process is zombie, call print routine and return. */ if (psinfo->pr_nlwp == 0) { if (tflg && !found) return (0); else { przom(psinfo); return (1); } } /* * Get current terminal. If none ("?") and 'a' is set, don't print * info. If 't' is set, check if term is in list of desired terminals * and print it if it is. */ i = 0; tp = gettty(psinfo); if (*tp == '?' && !found && !xflg) return (0); if (!(*tp == '?' && aflg) && tflg && !found) { int match = 0; char *other = NULL; for (ttyp = tty; ttyp->tname != NULL; ttyp++) { /* * Look for a name match */ if (strcmp(tp, ttyp->tname) == 0) { match = 1; break; } /* * Look for same device under different names. */ if ((other == NULL) && (psinfo->pr_ttydev == ttyp->tdev)) other = ttyp->tname; } if (!match) { if (other == NULL) return (0); tp = other; } } if (lflg) (void) printf("%2x", psinfo->pr_flag & 0377); if (uflg) { if (!nflg) { struct passwd *pwd; if ((pwd = getpwuid(psinfo->pr_euid)) != NULL) /* USER */ (void) printf("%-8.8s", pwd->pw_name); else /* UID */ (void) printf(" %7.7d", (int)psinfo->pr_euid); } else { (void) printf(" %5d", (int)psinfo->pr_euid); /* UID */ } } else if (lflg) (void) printf(" %5d", (int)psinfo->pr_euid); /* UID */ (void) printf("%*d", pidwidth + 1, (int)psinfo->pr_pid); /* PID */ if (lflg) (void) printf("%*d", pidwidth + 1, (int)psinfo->pr_ppid); /* PPID */ if (lflg) (void) printf("%3d", psinfo->pr_lwp.pr_cpu & 0377); /* CP */ if (uflg) { prtpct(psinfo->pr_pctcpu); /* %CPU */ prtpct(psinfo->pr_pctmem); /* %MEM */ } if (lflg) { (void) printf("%4d", psinfo->pr_lwp.pr_pri); /* PRI */ (void) printf("%3d", psinfo->pr_lwp.pr_nice); /* NICE */ } if (lflg || uflg) { if (psinfo->pr_flag & SSYS) /* SZ */ (void) printf(" 0"); else if (psinfo->pr_size) (void) printf(" %4lu", (ulong_t)psinfo->pr_size); else (void) printf(" ?"); if (psinfo->pr_flag & SSYS) /* RSS */ (void) printf(" 0"); else if (psinfo->pr_rssize) (void) printf(" %4lu", (ulong_t)psinfo->pr_rssize); else (void) printf(" ?"); } if (lflg) { /* WCHAN */ if (psinfo->pr_lwp.pr_sname != 'S') { (void) printf(" "); } else if (psinfo->pr_lwp.pr_wchan) { (void) printf(" %+8.8lx", (ulong_t)psinfo->pr_lwp.pr_wchan); } else { (void) printf(" ?"); } } if ((tplen = strlen(tp)) > 9) maxlen = twidth - tplen + 9; else maxlen = twidth; if (!lflg) (void) printf(" %-8.14s", tp); /* TTY */ (void) printf(" %c", psinfo->pr_lwp.pr_sname); /* STATE */ if (lflg) (void) printf(" %-8.14s", tp); /* TTY */ if (uflg) prtime(psinfo->pr_start); /* START */ /* time just for process */ tm = psinfo->pr_time.tv_sec; if (Sflg) { /* calculate time for process and all reaped children */ tm += psinfo->pr_ctime.tv_sec; if (psinfo->pr_time.tv_nsec + psinfo->pr_ctime.tv_nsec >= 1000000000) tm += 1; } (void) printf(" %2ld:%.2ld", tm / 60, tm % 60); /* TIME */ if (vflg) { if (psinfo->pr_flag & SSYS) /* SZ */ (void) printf(" 0"); else if (psinfo->pr_size) (void) printf("%5lu", (ulong_t)psinfo->pr_size); else (void) printf(" ?"); if (psinfo->pr_flag & SSYS) /* SZ */ (void) printf(" 0"); else if (psinfo->pr_rssize) (void) printf("%5lu", (ulong_t)psinfo->pr_rssize); else (void) printf(" ?"); prtpct(psinfo->pr_pctcpu); /* %CPU */ prtpct(psinfo->pr_pctmem); /* %MEM */ } if (cflg) { /* CMD */ wcnt = namencnt(psinfo->pr_fname, 16, maxlen); (void) printf(" %.*s", wcnt, psinfo->pr_fname); return (1); } /* * PRARGSZ == length of cmd arg string. */ if (psargs == NULL) { psa = &psinfo->pr_psargs[0]; i = PRARGSZ; tp = &psinfo->pr_psargs[PRARGSZ]; } else { psa = psargs; i = strlen(psargs); tp = psa + i; } for (cp = psa; cp < tp; /* empty */) { if (*cp == 0) break; length = mbtowc(&wchar, cp, MB_LEN_MAX); if (length < 0 || !iswprint(wchar)) { (void) printf(" [ %.16s ]", psinfo->pr_fname); return (1); } cp += length; } wcnt = namencnt(psa, i, maxlen); #if 0 /* dumps core on really long strings */ (void) printf(" %.*s", wcnt, psa); #else (void) putchar(' '); (void) fwrite(psa, 1, wcnt, stdout); #endif return (1); }