|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)lcmd2.c 3.11 4/24/85"; ! 3: #endif ! 4: ! 5: /* ! 6: * Copyright (c) 1983 Regents of the University of California, ! 7: * All rights reserved. Redistribution permitted subject to ! 8: * the terms of the Berkeley Software License Agreement. ! 9: */ ! 10: ! 11: #include "defs.h" ! 12: #include "string.h" ! 13: #include "value.h" ! 14: #include "var.h" ! 15: #include "lcmd.h" ! 16: #include <sys/resource.h> ! 17: #include "alias.h" ! 18: ! 19: /*ARGSUSED*/ ! 20: l_iostat(v, a) ! 21: struct value *v, *a; ! 22: { ! 23: register struct ww *w; ! 24: ! 25: if ((w = openiwin(14, "IO Statistics")) == 0) { ! 26: error("Can't open statistics window: %s.", wwerror()); ! 27: return; ! 28: } ! 29: wwprintf(w, "ttflush\twrite\terror\tzero\tchar\n"); ! 30: wwprintf(w, "%d\t%d\t%d\t%d\t%d\n", ! 31: wwnflush, wwnwr, wwnwre, wwnwrz, wwnwrc); ! 32: wwprintf(w, "wwwrite\tattempt\tchar\n"); ! 33: wwprintf(w, "%d\t%d\t%d\n", ! 34: wwnwwr, wwnwwra, wwnwwrc); ! 35: wwprintf(w, "wwupdat\tline\tmiss\tmajor\tmiss\n"); ! 36: wwprintf(w, "%d\t%d\t%d\t%d\t%d\n", ! 37: wwnupdate, wwnupdline, wwnupdmiss, wwnmajline, wwnmajmiss); ! 38: wwprintf(w, "select\terror\tzero\n"); ! 39: wwprintf(w, "%d\t%d\t%d\n", ! 40: wwnselect, wwnselecte, wwnselectz); ! 41: wwprintf(w, "read\terror\tzero\tchar\n"); ! 42: wwprintf(w, "%d\t%d\t%d\t%d\n", ! 43: wwnread, wwnreade, wwnreadz, wwnreadc); ! 44: wwprintf(w, "ptyread\terror\tzero\tcontrol\tdata\tchar\n"); ! 45: wwprintf(w, "%d\t%d\t%d\t%d\t%d\t%d\n", ! 46: wwnwread, wwnwreade, wwnwreadz, ! 47: wwnwreadp, wwnwreadd, wwnwreadc); ! 48: waitnl(w); ! 49: closeiwin(w); ! 50: } ! 51: ! 52: struct lcmd_arg arg_time[] = { ! 53: { "who", 1, ARG_STR }, ! 54: 0 ! 55: }; ! 56: ! 57: /*ARGSUSED*/ ! 58: l_time(v, a) ! 59: struct value *v; ! 60: register struct value *a; ! 61: { ! 62: register struct ww *w; ! 63: struct rusage rusage; ! 64: struct timeval timeval; ! 65: char *strtime(); ! 66: ! 67: if ((w = openiwin(6, "Timing and Resource Usage")) == 0) { ! 68: error("Can't open time window: %s.", wwerror()); ! 69: return; ! 70: } ! 71: ! 72: (void) gettimeofday(&timeval, (struct timezone *)0); ! 73: timeval.tv_sec -= starttime.tv_sec; ! 74: if ((timeval.tv_usec -= starttime.tv_usec) < 0) { ! 75: timeval.tv_sec--; ! 76: timeval.tv_usec += 1000000; ! 77: } ! 78: (void) getrusage(a->v_type == V_STR ! 79: && str_match(a->v_str, "children", 1) ! 80: ? RUSAGE_CHILDREN : RUSAGE_SELF, &rusage); ! 81: ! 82: wwprintf(w, "time\t\tutime\t\tstime\t\tmaxrss\tixrss\tidrss\tisrss\n"); ! 83: wwprintf(w, "%-16s", strtime(&timeval)); ! 84: wwprintf(w, "%-16s", strtime(&rusage.ru_utime)); ! 85: wwprintf(w, "%-16s", strtime(&rusage.ru_stime)); ! 86: wwprintf(w, "%D\t%D\t%D\t%D\n", ! 87: rusage.ru_maxrss, rusage.ru_ixrss, ! 88: rusage.ru_idrss, rusage.ru_isrss); ! 89: wwprintf(w, "minflt\tmajflt\tnswap\tinblk\toublk\tmsgsnd\tmsgrcv\tnsigs\tnvcsw\tnivcsw\n"); ! 90: wwprintf(w, "%D\t%D\t%D\t%D\t%D\t%D\t%D\t%D\t%D\t%D\n", ! 91: rusage.ru_minflt, rusage.ru_majflt, rusage.ru_nswap, ! 92: rusage.ru_inblock, rusage.ru_oublock, ! 93: rusage.ru_msgsnd, rusage.ru_msgrcv, rusage.ru_nsignals, ! 94: rusage.ru_nvcsw, rusage.ru_nivcsw); ! 95: ! 96: waitnl(w); ! 97: closeiwin(w); ! 98: } ! 99: ! 100: char * ! 101: strtime(t) ! 102: register struct timeval *t; ! 103: { ! 104: char fill = 0; ! 105: static char buf[20]; ! 106: register char *p = buf; ! 107: ! 108: if (t->tv_sec > 60*60) { ! 109: (void) sprintf(p, "%D:", t->tv_sec / (60*60)); ! 110: while (*p++) ! 111: ; ! 112: p--; ! 113: t->tv_sec %= 60*60; ! 114: fill++; ! 115: } ! 116: if (t->tv_sec > 60) { ! 117: (void) sprintf(p, fill ? "%02D:" : "%D:", t->tv_sec / 60); ! 118: while (*p++) ! 119: ; ! 120: p--; ! 121: t->tv_sec %= 60; ! 122: fill++; ! 123: } ! 124: (void) sprintf(p, fill ? "%02D.%02d" : "%D.%02D", ! 125: t->tv_sec, t->tv_usec / 10000); ! 126: return buf; ! 127: } ! 128: ! 129: /*ARGSUSED*/ ! 130: l_list(v, a) ! 131: struct value *v, *a; ! 132: { ! 133: register struct ww *w, *wp; ! 134: register i; ! 135: int n; ! 136: ! 137: for (n = 0, i = 0; i < NWINDOW; i++) ! 138: if (window[i] != 0) ! 139: n++; ! 140: if (n == 0) { ! 141: error("No windows."); ! 142: return; ! 143: } ! 144: if ((w = openiwin(n + 2, "Windows")) == 0) { ! 145: error("Can't open listing window: %s.", wwerror()); ! 146: return; ! 147: } ! 148: for (i = 0; i < NWINDOW; i++) { ! 149: if ((wp = window[i]) == 0) ! 150: continue; ! 151: wwprintf(w, "%c %c %-13s %-.*s\n", ! 152: wp == selwin ? '*' : ' ', ! 153: i + '1', ! 154: wp->ww_state == WWS_HASPROC ? "" : "(No process)", ! 155: wwncol - 20, ! 156: wp->ww_label ? wp->ww_label : "(No label)"); ! 157: } ! 158: waitnl(w); ! 159: closeiwin(w); ! 160: } ! 161: ! 162: /*ARGSUSED*/ ! 163: l_variable(v, a) ! 164: struct value *v, *a; ! 165: { ! 166: register struct ww *w; ! 167: int printvar(); ! 168: ! 169: if ((w = openiwin(wwnrow - 3, "Variables")) == 0) { ! 170: error("Can't open variable window: %s.", wwerror()); ! 171: return; ! 172: } ! 173: if (var_walk(printvar, (int)w) >= 0) ! 174: waitnl(w); ! 175: closeiwin(w); ! 176: } ! 177: ! 178: printvar(w, r) ! 179: register struct ww *w; ! 180: register struct var *r; ! 181: { ! 182: if (more(w, 0) == 2) ! 183: return -1; ! 184: wwprintf(w, "%16s ", r->r_name); ! 185: switch (r->r_val.v_type) { ! 186: case V_STR: ! 187: wwprintf(w, "%s\n", r->r_val.v_str); ! 188: break; ! 189: case V_NUM: ! 190: wwprintf(w, "%d\n", r->r_val.v_num); ! 191: break; ! 192: case V_ERR: ! 193: wwprintf(w, "ERROR\n"); ! 194: break; ! 195: } ! 196: return 0; ! 197: } ! 198: ! 199: struct lcmd_arg arg_shell[] = { ! 200: { "", 0, ARG_ANY|ARG_LIST }, ! 201: 0 ! 202: }; ! 203: ! 204: l_shell(v, a) ! 205: struct value *v, *a; ! 206: { ! 207: register char **pp; ! 208: register struct value *vp; ! 209: ! 210: if (a->v_type == V_ERR) { ! 211: if ((v->v_str = str_cpy(shellfile)) != 0) ! 212: v->v_type = V_STR; ! 213: return; ! 214: } ! 215: if (v->v_str = shellfile) { ! 216: v->v_type = V_STR; ! 217: for (pp = shell + 1; *pp; pp++) { ! 218: str_free(*pp); ! 219: *pp = 0; ! 220: } ! 221: } ! 222: for (pp = shell, vp = a; ! 223: vp->v_type != V_ERR && pp < &shell[sizeof shell/sizeof *shell-1]; ! 224: pp++, vp++) ! 225: if ((*pp = vp->v_type == V_STR ? ! 226: str_cpy(vp->v_str) : str_itoa(vp->v_num)) == 0) { ! 227: /* just leave shell[] the way it is */ ! 228: p_memerror(); ! 229: break; ! 230: } ! 231: if (shellfile = *shell) ! 232: if (*shell = rindex(shellfile, '/')) ! 233: (*shell)++; ! 234: else ! 235: *shell = shellfile; ! 236: } ! 237: ! 238: struct lcmd_arg arg_alias[] = { ! 239: { "", 0, ARG_STR }, ! 240: { "", 0, ARG_STR|ARG_LIST }, ! 241: 0 ! 242: }; ! 243: ! 244: l_alias(v, a) ! 245: struct value *v, *a; ! 246: { ! 247: if (a->v_type == V_ERR) { ! 248: register struct ww *w; ! 249: int printalias(); ! 250: ! 251: if ((w = openiwin(wwnrow - 3, "Aliases")) == 0) { ! 252: error("Can't open alias window: %s.", wwerror()); ! 253: return; ! 254: } ! 255: if (alias_walk(printalias, (int)w) >= 0) ! 256: waitnl(w); ! 257: closeiwin(w); ! 258: } else { ! 259: register struct alias *ap = 0; ! 260: ! 261: if (ap = alias_lookup(a->v_str)) { ! 262: if ((v->v_str = str_cpy(ap->a_buf)) == 0) { ! 263: p_memerror(); ! 264: return; ! 265: } ! 266: v->v_type = V_STR; ! 267: } ! 268: if (a[1].v_type == V_STR) { ! 269: register struct value *vp; ! 270: register char *p, *q; ! 271: char *str; ! 272: register n; ! 273: ! 274: for (n = 0, vp = a + 1; vp->v_type != V_ERR; vp++, n++) ! 275: for (p = vp->v_str; *p; p++, n++) ! 276: ; ! 277: if ((str = str_alloc(n)) == 0) { ! 278: p_memerror(); ! 279: return; ! 280: } ! 281: for (q = str, vp = a + 1; vp->v_type != V_ERR; ! 282: vp++, q[-1] = ' ') ! 283: for (p = vp->v_str; *q++ = *p++;) ! 284: ; ! 285: q[-1] = 0; ! 286: if ((ap = alias_set(a[0].v_str, (char *)0)) == 0) { ! 287: p_memerror(); ! 288: str_free(str); ! 289: return; ! 290: } ! 291: ap->a_buf = str; ! 292: } ! 293: } ! 294: } ! 295: ! 296: printalias(w, a) ! 297: register struct ww *w; ! 298: register struct alias *a; ! 299: { ! 300: if (more(w, 0) == 2) ! 301: return -1; ! 302: wwprintf(w, "%16s %s\n", a->a_name, a->a_buf); ! 303: return 0; ! 304: } ! 305: ! 306: struct lcmd_arg arg_unalias[] = { ! 307: { "alias", 1, ARG_STR }, ! 308: 0 ! 309: }; ! 310: ! 311: l_unalias(v, a) ! 312: struct value *v, *a; ! 313: { ! 314: if (a->v_type == ARG_STR) ! 315: v->v_num = alias_unset(a->v_str); ! 316: v->v_type = V_NUM; ! 317: } ! 318: ! 319: struct lcmd_arg arg_echo[] = { ! 320: { "window", 1, ARG_NUM }, ! 321: { "", 0, ARG_ANY|ARG_LIST }, ! 322: 0 ! 323: }; ! 324: ! 325: /*ARGSUSED*/ ! 326: l_echo(v, a) ! 327: struct value *v; ! 328: register struct value *a; ! 329: { ! 330: char buf[20]; ! 331: struct ww *w; ! 332: ! 333: if ((w = vtowin(a++, selwin)) == 0) ! 334: return; ! 335: while (a->v_type != V_ERR) { ! 336: if (a->v_type == V_NUM) { ! 337: (void) sprintf(buf, "%d", a->v_num); ! 338: (void) wwwrite(w, buf, strlen(buf)); ! 339: } else ! 340: (void) wwwrite(w, a->v_str, strlen(a->v_str)); ! 341: if ((++a)->v_type != V_ERR) ! 342: (void) wwwrite(w, " ", 1); ! 343: } ! 344: (void) wwwrite(w, "\r\n", 2); ! 345: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.