17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 59acbbeafSnn * Common Development and Distribution License (the "License"). 69acbbeafSnn * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 218fd04b83SRoger A. Faulkner 227c478bd9Sstevel@tonic-gate /* 23794f0adbSRoger A. Faulkner * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. 24fca543caSDJ Hoffman * Copyright (c) 2015, Joyent, Inc. All rights reserved. 25*542a7b7fSCarlos Neira * Copyright 2019, Carlos Neira <cneirabustos@gmail.com> 26*542a7b7fSCarlos Neira * Copyright 2019 OmniOS Community Edition (OmniOSce) Association. 277c478bd9Sstevel@tonic-gate */ 287c478bd9Sstevel@tonic-gate 297c478bd9Sstevel@tonic-gate #include <stdio.h> 307c478bd9Sstevel@tonic-gate #define __EXTENSIONS__ 317c478bd9Sstevel@tonic-gate #include <string.h> 327c478bd9Sstevel@tonic-gate #undef __EXTENSIONS__ 337c478bd9Sstevel@tonic-gate #include <signal.h> 347c478bd9Sstevel@tonic-gate #include <errno.h> 357c478bd9Sstevel@tonic-gate #include "libproc.h" 36*542a7b7fSCarlos Neira #include <sys/procfs_isa.h> 377c478bd9Sstevel@tonic-gate 387c478bd9Sstevel@tonic-gate static const char * 397c478bd9Sstevel@tonic-gate rawfltname(int flt) 407c478bd9Sstevel@tonic-gate { 417c478bd9Sstevel@tonic-gate const char *name; 427c478bd9Sstevel@tonic-gate 437c478bd9Sstevel@tonic-gate switch (flt) { 447c478bd9Sstevel@tonic-gate case FLTILL: name = "FLTILL"; break; 457c478bd9Sstevel@tonic-gate case FLTPRIV: name = "FLTPRIV"; break; 467c478bd9Sstevel@tonic-gate case FLTBPT: name = "FLTBPT"; break; 477c478bd9Sstevel@tonic-gate case FLTTRACE: name = "FLTTRACE"; break; 487c478bd9Sstevel@tonic-gate case FLTACCESS: name = "FLTACCESS"; break; 497c478bd9Sstevel@tonic-gate case FLTBOUNDS: name = "FLTBOUNDS"; break; 507c478bd9Sstevel@tonic-gate case FLTIOVF: name = "FLTIOVF"; break; 517c478bd9Sstevel@tonic-gate case FLTIZDIV: name = "FLTIZDIV"; break; 527c478bd9Sstevel@tonic-gate case FLTFPE: name = "FLTFPE"; break; 537c478bd9Sstevel@tonic-gate case FLTSTACK: name = "FLTSTACK"; break; 547c478bd9Sstevel@tonic-gate case FLTPAGE: name = "FLTPAGE"; break; 557c478bd9Sstevel@tonic-gate case FLTWATCH: name = "FLTWATCH"; break; 567c478bd9Sstevel@tonic-gate case FLTCPCOVF: name = "FLTCPCOVF"; break; 577c478bd9Sstevel@tonic-gate default: name = NULL; break; 587c478bd9Sstevel@tonic-gate } 597c478bd9Sstevel@tonic-gate 607c478bd9Sstevel@tonic-gate return (name); 617c478bd9Sstevel@tonic-gate } 627c478bd9Sstevel@tonic-gate 637c478bd9Sstevel@tonic-gate /* 647c478bd9Sstevel@tonic-gate * Return the name of a fault. 657c478bd9Sstevel@tonic-gate * Manufacture a name for unknown fault. 667c478bd9Sstevel@tonic-gate */ 677c478bd9Sstevel@tonic-gate char * 687c478bd9Sstevel@tonic-gate proc_fltname(int flt, char *buf, size_t bufsz) 697c478bd9Sstevel@tonic-gate { 707c478bd9Sstevel@tonic-gate const char *name = rawfltname(flt); 717c478bd9Sstevel@tonic-gate size_t len; 727c478bd9Sstevel@tonic-gate 737c478bd9Sstevel@tonic-gate if (bufsz == 0) /* force a program failure */ 747c478bd9Sstevel@tonic-gate return (NULL); 757c478bd9Sstevel@tonic-gate 767c478bd9Sstevel@tonic-gate if (name != NULL) { 777c478bd9Sstevel@tonic-gate len = strlen(name); 787c478bd9Sstevel@tonic-gate (void) strncpy(buf, name, bufsz); 797c478bd9Sstevel@tonic-gate } else { 807c478bd9Sstevel@tonic-gate len = snprintf(buf, bufsz, "FLT#%d", flt); 817c478bd9Sstevel@tonic-gate } 827c478bd9Sstevel@tonic-gate 837c478bd9Sstevel@tonic-gate if (len >= bufsz) /* ensure null-termination */ 847c478bd9Sstevel@tonic-gate buf[bufsz-1] = '\0'; 857c478bd9Sstevel@tonic-gate 867c478bd9Sstevel@tonic-gate return (buf); 877c478bd9Sstevel@tonic-gate } 887c478bd9Sstevel@tonic-gate 897c478bd9Sstevel@tonic-gate /* 907c478bd9Sstevel@tonic-gate * Return the name of a signal. 917c478bd9Sstevel@tonic-gate * Manufacture a name for unknown signal. 927c478bd9Sstevel@tonic-gate */ 937c478bd9Sstevel@tonic-gate char * 947c478bd9Sstevel@tonic-gate proc_signame(int sig, char *buf, size_t bufsz) 957c478bd9Sstevel@tonic-gate { 967c478bd9Sstevel@tonic-gate char name[SIG2STR_MAX+4]; 977c478bd9Sstevel@tonic-gate size_t len; 987c478bd9Sstevel@tonic-gate 997c478bd9Sstevel@tonic-gate if (bufsz == 0) /* force a program failure */ 1007c478bd9Sstevel@tonic-gate return (NULL); 1017c478bd9Sstevel@tonic-gate 1027c478bd9Sstevel@tonic-gate /* sig2str() omits the leading "SIG" */ 1037c478bd9Sstevel@tonic-gate (void) strcpy(name, "SIG"); 1047c478bd9Sstevel@tonic-gate 1057c478bd9Sstevel@tonic-gate if (sig2str(sig, name+3) == 0) { 1067c478bd9Sstevel@tonic-gate len = strlen(name); 1077c478bd9Sstevel@tonic-gate (void) strncpy(buf, name, bufsz); 1087c478bd9Sstevel@tonic-gate } else { 1097c478bd9Sstevel@tonic-gate len = snprintf(buf, bufsz, "SIG#%d", sig); 1107c478bd9Sstevel@tonic-gate } 1117c478bd9Sstevel@tonic-gate 1127c478bd9Sstevel@tonic-gate if (len >= bufsz) /* ensure null-termination */ 1137c478bd9Sstevel@tonic-gate buf[bufsz-1] = '\0'; 1147c478bd9Sstevel@tonic-gate 1157c478bd9Sstevel@tonic-gate return (buf); 1167c478bd9Sstevel@tonic-gate } 1177c478bd9Sstevel@tonic-gate 1187c478bd9Sstevel@tonic-gate static const char *const systable[] = { 1197c478bd9Sstevel@tonic-gate NULL, /* 0 */ 1207c478bd9Sstevel@tonic-gate "_exit", /* 1 */ 1218fd04b83SRoger A. Faulkner NULL, /* 2 */ 1227c478bd9Sstevel@tonic-gate "read", /* 3 */ 1237c478bd9Sstevel@tonic-gate "write", /* 4 */ 1247c478bd9Sstevel@tonic-gate "open", /* 5 */ 1257c478bd9Sstevel@tonic-gate "close", /* 6 */ 126794f0adbSRoger A. Faulkner "linkat", /* 7 */ 1278fd04b83SRoger A. Faulkner NULL, /* 8 */ 1287c478bd9Sstevel@tonic-gate "link", /* 9 */ 1297c478bd9Sstevel@tonic-gate "unlink", /* 10 */ 130794f0adbSRoger A. Faulkner "symlinkat", /* 11 */ 1317c478bd9Sstevel@tonic-gate "chdir", /* 12 */ 1327c478bd9Sstevel@tonic-gate "time", /* 13 */ 1337c478bd9Sstevel@tonic-gate "mknod", /* 14 */ 1347c478bd9Sstevel@tonic-gate "chmod", /* 15 */ 1357c478bd9Sstevel@tonic-gate "chown", /* 16 */ 1367c478bd9Sstevel@tonic-gate "brk", /* 17 */ 1377c478bd9Sstevel@tonic-gate "stat", /* 18 */ 1387c478bd9Sstevel@tonic-gate "lseek", /* 19 */ 1397c478bd9Sstevel@tonic-gate "getpid", /* 20 */ 1407c478bd9Sstevel@tonic-gate "mount", /* 21 */ 141794f0adbSRoger A. Faulkner "readlinkat", /* 22 */ 1427c478bd9Sstevel@tonic-gate "setuid", /* 23 */ 1437c478bd9Sstevel@tonic-gate "getuid", /* 24 */ 1447c478bd9Sstevel@tonic-gate "stime", /* 25 */ 1457c478bd9Sstevel@tonic-gate "ptrace", /* 26 */ 1467c478bd9Sstevel@tonic-gate "alarm", /* 27 */ 1477c478bd9Sstevel@tonic-gate "fstat", /* 28 */ 1487c478bd9Sstevel@tonic-gate "pause", /* 29 */ 1498fd04b83SRoger A. Faulkner NULL, /* 30 */ 1507c478bd9Sstevel@tonic-gate "stty", /* 31 */ 1517c478bd9Sstevel@tonic-gate "gtty", /* 32 */ 1527c478bd9Sstevel@tonic-gate "access", /* 33 */ 1537c478bd9Sstevel@tonic-gate "nice", /* 34 */ 1547c478bd9Sstevel@tonic-gate "statfs", /* 35 */ 1557c478bd9Sstevel@tonic-gate "sync", /* 36 */ 1567c478bd9Sstevel@tonic-gate "kill", /* 37 */ 1577c478bd9Sstevel@tonic-gate "fstatfs", /* 38 */ 1587c478bd9Sstevel@tonic-gate "pgrpsys", /* 39 */ 1599acbbeafSnn "uucopystr", /* 40 */ 1608fd04b83SRoger A. Faulkner NULL, /* 41 */ 1617c478bd9Sstevel@tonic-gate "pipe", /* 42 */ 1627c478bd9Sstevel@tonic-gate "times", /* 43 */ 1637c478bd9Sstevel@tonic-gate "profil", /* 44 */ 1648fd04b83SRoger A. Faulkner "faccessat", /* 45 */ 1657c478bd9Sstevel@tonic-gate "setgid", /* 46 */ 1667c478bd9Sstevel@tonic-gate "getgid", /* 47 */ 167794f0adbSRoger A. Faulkner "mknodat", /* 48 */ 1687c478bd9Sstevel@tonic-gate "msgsys", /* 49 */ 1697c478bd9Sstevel@tonic-gate "sysi86", /* 50 */ 1707c478bd9Sstevel@tonic-gate "acct", /* 51 */ 1717c478bd9Sstevel@tonic-gate "shmsys", /* 52 */ 1727c478bd9Sstevel@tonic-gate "semsys", /* 53 */ 1737c478bd9Sstevel@tonic-gate "ioctl", /* 54 */ 1747c478bd9Sstevel@tonic-gate "uadmin", /* 55 */ 1758fd04b83SRoger A. Faulkner "fchownat", /* 56 */ 1767c478bd9Sstevel@tonic-gate "utssys", /* 57 */ 1777c478bd9Sstevel@tonic-gate "fdsync", /* 58 */ 1787c478bd9Sstevel@tonic-gate "execve", /* 59 */ 1797c478bd9Sstevel@tonic-gate "umask", /* 60 */ 1807c478bd9Sstevel@tonic-gate "chroot", /* 61 */ 1817c478bd9Sstevel@tonic-gate "fcntl", /* 62 */ 1827c478bd9Sstevel@tonic-gate "ulimit", /* 63 */ 1838fd04b83SRoger A. Faulkner "renameat", /* 64 */ 1848fd04b83SRoger A. Faulkner "unlinkat", /* 65 */ 1858fd04b83SRoger A. Faulkner "fstatat", /* 66 */ 1868fd04b83SRoger A. Faulkner "fstatat64", /* 67 */ 1878fd04b83SRoger A. Faulkner "openat", /* 68 */ 1888fd04b83SRoger A. Faulkner "openat64", /* 69 */ 1897c478bd9Sstevel@tonic-gate "tasksys", /* 70 */ 1907c478bd9Sstevel@tonic-gate "acctctl", /* 71 */ 1917c478bd9Sstevel@tonic-gate "exacctsys", /* 72 */ 1927c478bd9Sstevel@tonic-gate "getpagesizes", /* 73 */ 1937c478bd9Sstevel@tonic-gate "rctlsys", /* 74 */ 1947c478bd9Sstevel@tonic-gate "issetugid", /* 75 */ 1957c478bd9Sstevel@tonic-gate "fsat", /* 76 */ 1967c478bd9Sstevel@tonic-gate "lwp_park", /* 77 */ 1977c478bd9Sstevel@tonic-gate "sendfilev", /* 78 */ 1987c478bd9Sstevel@tonic-gate "rmdir", /* 79 */ 1997c478bd9Sstevel@tonic-gate "mkdir", /* 80 */ 2007c478bd9Sstevel@tonic-gate "getdents", /* 81 */ 2017c478bd9Sstevel@tonic-gate "privsys", /* 82 */ 2027c478bd9Sstevel@tonic-gate "ucredsys", /* 83 */ 2037c478bd9Sstevel@tonic-gate "sysfs", /* 84 */ 2047c478bd9Sstevel@tonic-gate "getmsg", /* 85 */ 2057c478bd9Sstevel@tonic-gate "putmsg", /* 86 */ 2068fd04b83SRoger A. Faulkner NULL, /* 87 */ 2077c478bd9Sstevel@tonic-gate "lstat", /* 88 */ 2087c478bd9Sstevel@tonic-gate "symlink", /* 89 */ 2097c478bd9Sstevel@tonic-gate "readlink", /* 90 */ 2107c478bd9Sstevel@tonic-gate "setgroups", /* 91 */ 2117c478bd9Sstevel@tonic-gate "getgroups", /* 92 */ 2127c478bd9Sstevel@tonic-gate "fchmod", /* 93 */ 2137c478bd9Sstevel@tonic-gate "fchown", /* 94 */ 2147c478bd9Sstevel@tonic-gate "sigprocmask", /* 95 */ 2157c478bd9Sstevel@tonic-gate "sigsuspend", /* 96 */ 2167c478bd9Sstevel@tonic-gate "sigaltstack", /* 97 */ 2177c478bd9Sstevel@tonic-gate "sigaction", /* 98 */ 2187c478bd9Sstevel@tonic-gate "sigpending", /* 99 */ 2197c478bd9Sstevel@tonic-gate "context", /* 100 */ 220794f0adbSRoger A. Faulkner "fchmodat", /* 101 */ 221794f0adbSRoger A. Faulkner "mkdirat", /* 102 */ 2227c478bd9Sstevel@tonic-gate "statvfs", /* 103 */ 2237c478bd9Sstevel@tonic-gate "fstatvfs", /* 104 */ 2247c478bd9Sstevel@tonic-gate "getloadavg", /* 105 */ 2257c478bd9Sstevel@tonic-gate "nfssys", /* 106 */ 2267c478bd9Sstevel@tonic-gate "waitid", /* 107 */ 2277c478bd9Sstevel@tonic-gate "sigsendsys", /* 108 */ 2287c478bd9Sstevel@tonic-gate "hrtsys", /* 109 */ 2297c478bd9Sstevel@tonic-gate "acancel", /* 110 */ 2307c478bd9Sstevel@tonic-gate "async", /* 111 */ 2317c478bd9Sstevel@tonic-gate "priocntlsys", /* 112 */ 2327c478bd9Sstevel@tonic-gate "pathconf", /* 113 */ 2337c478bd9Sstevel@tonic-gate "mincore", /* 114 */ 2347c478bd9Sstevel@tonic-gate "mmap", /* 115 */ 2357c478bd9Sstevel@tonic-gate "mprotect", /* 116 */ 2367c478bd9Sstevel@tonic-gate "munmap", /* 117 */ 2377c478bd9Sstevel@tonic-gate "fpathconf", /* 118 */ 2387c478bd9Sstevel@tonic-gate "vfork", /* 119 */ 2397c478bd9Sstevel@tonic-gate "fchdir", /* 120 */ 2407c478bd9Sstevel@tonic-gate "readv", /* 121 */ 2417c478bd9Sstevel@tonic-gate "writev", /* 122 */ 242fca543caSDJ Hoffman "preadv", /* 123 */ 243fca543caSDJ Hoffman "pwritev", /* 124 */ 2448fd04b83SRoger A. Faulkner NULL, /* 125 */ 2459d12795fSRobert Mustacchi "getrandom", /* 126 */ 2460616c1c3SMichael Corcoran "mmapobj", /* 127 */ 2477c478bd9Sstevel@tonic-gate "setrlimit", /* 128 */ 2487c478bd9Sstevel@tonic-gate "getrlimit", /* 129 */ 2497c478bd9Sstevel@tonic-gate "lchown", /* 130 */ 2507c478bd9Sstevel@tonic-gate "memcntl", /* 131 */ 2517c478bd9Sstevel@tonic-gate "getpmsg", /* 132 */ 2527c478bd9Sstevel@tonic-gate "putpmsg", /* 133 */ 2537c478bd9Sstevel@tonic-gate "rename", /* 134 */ 2547c478bd9Sstevel@tonic-gate "uname", /* 135 */ 2557c478bd9Sstevel@tonic-gate "setegid", /* 136 */ 2567c478bd9Sstevel@tonic-gate "sysconfig", /* 137 */ 2577c478bd9Sstevel@tonic-gate "adjtime", /* 138 */ 2587c478bd9Sstevel@tonic-gate "systeminfo", /* 139 */ 259a237e38eSth "sharefs", /* 140 */ 2607c478bd9Sstevel@tonic-gate "seteuid", /* 141 */ 261a10acbd6Seschrock "forksys", /* 142 */ 2628fd04b83SRoger A. Faulkner NULL, /* 143 */ 2637c478bd9Sstevel@tonic-gate "sigtimedwait", /* 144 */ 2647c478bd9Sstevel@tonic-gate "lwp_info", /* 145 */ 2657c478bd9Sstevel@tonic-gate "yield", /* 146 */ 2668fd04b83SRoger A. Faulkner NULL, /* 147 */ 2677c478bd9Sstevel@tonic-gate "lwp_sema_post", /* 148 */ 2687c478bd9Sstevel@tonic-gate "lwp_sema_trywait", /* 149 */ 2697c478bd9Sstevel@tonic-gate "lwp_detatch", /* 150 */ 2707c478bd9Sstevel@tonic-gate "corectl", /* 151 */ 2717c478bd9Sstevel@tonic-gate "modctl", /* 152 */ 2727c478bd9Sstevel@tonic-gate "fchroot", /* 153 */ 2738fd04b83SRoger A. Faulkner NULL, /* 154 */ 2747c478bd9Sstevel@tonic-gate "vhangup", /* 155 */ 2757c478bd9Sstevel@tonic-gate "gettimeofday", /* 156 */ 2767c478bd9Sstevel@tonic-gate "getitimer", /* 157 */ 2777c478bd9Sstevel@tonic-gate "setitimer", /* 158 */ 2787c478bd9Sstevel@tonic-gate "lwp_create", /* 159 */ 2797c478bd9Sstevel@tonic-gate "lwp_exit", /* 160 */ 2807c478bd9Sstevel@tonic-gate "lwp_suspend", /* 161 */ 2817c478bd9Sstevel@tonic-gate "lwp_continue", /* 162 */ 2827c478bd9Sstevel@tonic-gate "lwp_kill", /* 163 */ 2837c478bd9Sstevel@tonic-gate "lwp_self", /* 164 */ 2847c478bd9Sstevel@tonic-gate "lwp_sigmask", /* 165 */ 2857c478bd9Sstevel@tonic-gate "lwp_private", /* 166 */ 2867c478bd9Sstevel@tonic-gate "lwp_wait", /* 167 */ 287883492d5Sraf "lwp_mutex_wakeup", /* 168 */ 2888fd04b83SRoger A. Faulkner NULL, /* 169 */ 2897c478bd9Sstevel@tonic-gate "lwp_cond_wait", /* 170 */ 2907c478bd9Sstevel@tonic-gate "lwp_cond_signal", /* 171 */ 2917c478bd9Sstevel@tonic-gate "lwp_cond_broadcast", /* 172 */ 2927c478bd9Sstevel@tonic-gate "pread", /* 173 */ 2937c478bd9Sstevel@tonic-gate "pwrite", /* 174 */ 2947c478bd9Sstevel@tonic-gate "llseek", /* 175 */ 2957c478bd9Sstevel@tonic-gate "inst_sync", /* 176 */ 2969acbbeafSnn "brand", /* 177 */ 2977c478bd9Sstevel@tonic-gate "kaio", /* 178 */ 2987c478bd9Sstevel@tonic-gate "cpc", /* 179 */ 2997c478bd9Sstevel@tonic-gate "lgrpsys", /* 180 */ 3007c478bd9Sstevel@tonic-gate "rusagesys", /* 181 */ 3017c478bd9Sstevel@tonic-gate "portfs", /* 182 */ 3027c478bd9Sstevel@tonic-gate "pollsys", /* 183 */ 3038fd04b83SRoger A. Faulkner "labelsys", /* 184 */ 3047c478bd9Sstevel@tonic-gate "acl", /* 185 */ 3057c478bd9Sstevel@tonic-gate "auditsys", /* 186 */ 3067c478bd9Sstevel@tonic-gate "processor_bind", /* 187 */ 3077c478bd9Sstevel@tonic-gate "processor_info", /* 188 */ 3087c478bd9Sstevel@tonic-gate "p_online", /* 189 */ 3097c478bd9Sstevel@tonic-gate "sigqueue", /* 190 */ 3107c478bd9Sstevel@tonic-gate "clock_gettime", /* 191 */ 3117c478bd9Sstevel@tonic-gate "clock_settime", /* 192 */ 3127c478bd9Sstevel@tonic-gate "clock_getres", /* 193 */ 3137c478bd9Sstevel@tonic-gate "timer_create", /* 194 */ 3147c478bd9Sstevel@tonic-gate "timer_delete", /* 195 */ 3157c478bd9Sstevel@tonic-gate "timer_settime", /* 196 */ 3167c478bd9Sstevel@tonic-gate "timer_gettime", /* 197 */ 3177c478bd9Sstevel@tonic-gate "timer_getoverrun", /* 198 */ 3187c478bd9Sstevel@tonic-gate "nanosleep", /* 199 */ 3197c478bd9Sstevel@tonic-gate "facl", /* 200 */ 3207c478bd9Sstevel@tonic-gate "door", /* 201 */ 3217c478bd9Sstevel@tonic-gate "setreuid", /* 202 */ 3227c478bd9Sstevel@tonic-gate "setregid", /* 203 */ 3237c478bd9Sstevel@tonic-gate "install_utrap", /* 204 */ 3247c478bd9Sstevel@tonic-gate "signotify", /* 205 */ 3257c478bd9Sstevel@tonic-gate "schedctl", /* 206 */ 3267c478bd9Sstevel@tonic-gate "pset", /* 207 */ 3277c478bd9Sstevel@tonic-gate "sparc_utrap_install", /* 208 */ 3287c478bd9Sstevel@tonic-gate "resolvepath", /* 209 */ 3297c478bd9Sstevel@tonic-gate "lwp_mutex_timedlock", /* 210 */ 3307c478bd9Sstevel@tonic-gate "lwp_sema_timedwait", /* 211 */ 3317c478bd9Sstevel@tonic-gate "lwp_rwlock_sys", /* 212 */ 3327c478bd9Sstevel@tonic-gate "getdents64", /* 213 */ 3337c478bd9Sstevel@tonic-gate "mmap64", /* 214 */ 3347c478bd9Sstevel@tonic-gate "stat64", /* 215 */ 3357c478bd9Sstevel@tonic-gate "lstat64", /* 216 */ 3367c478bd9Sstevel@tonic-gate "fstat64", /* 217 */ 3377c478bd9Sstevel@tonic-gate "statvfs64", /* 218 */ 3387c478bd9Sstevel@tonic-gate "fstatvfs64", /* 219 */ 3397c478bd9Sstevel@tonic-gate "setrlimit64", /* 220 */ 3407c478bd9Sstevel@tonic-gate "getrlimit64", /* 221 */ 3417c478bd9Sstevel@tonic-gate "pread64", /* 222 */ 3427c478bd9Sstevel@tonic-gate "pwrite64", /* 223 */ 3438fd04b83SRoger A. Faulkner NULL, /* 224 */ 3447c478bd9Sstevel@tonic-gate "open64", /* 225 */ 3457c478bd9Sstevel@tonic-gate "rpcmod", /* 226 */ 3467c478bd9Sstevel@tonic-gate "zone", /* 227 */ 3477c478bd9Sstevel@tonic-gate "autofssys", /* 228 */ 3487c478bd9Sstevel@tonic-gate "getcwd", /* 229 */ 3497c478bd9Sstevel@tonic-gate "so_socket", /* 230 */ 3507c478bd9Sstevel@tonic-gate "so_socketpair", /* 231 */ 3517c478bd9Sstevel@tonic-gate "bind", /* 232 */ 3527c478bd9Sstevel@tonic-gate "listen", /* 233 */ 3537c478bd9Sstevel@tonic-gate "accept", /* 234 */ 3547c478bd9Sstevel@tonic-gate "connect", /* 235 */ 3557c478bd9Sstevel@tonic-gate "shutdown", /* 236 */ 3567c478bd9Sstevel@tonic-gate "recv", /* 237 */ 3577c478bd9Sstevel@tonic-gate "recvfrom", /* 238 */ 3587c478bd9Sstevel@tonic-gate "recvmsg", /* 239 */ 3597c478bd9Sstevel@tonic-gate "send", /* 240 */ 3607c478bd9Sstevel@tonic-gate "sendmsg", /* 241 */ 3617c478bd9Sstevel@tonic-gate "sendto", /* 242 */ 3627c478bd9Sstevel@tonic-gate "getpeername", /* 243 */ 3637c478bd9Sstevel@tonic-gate "getsockname", /* 244 */ 3647c478bd9Sstevel@tonic-gate "getsockopt", /* 245 */ 3657c478bd9Sstevel@tonic-gate "setsockopt", /* 246 */ 3667c478bd9Sstevel@tonic-gate "sockconfig", /* 247 */ 3677c478bd9Sstevel@tonic-gate "ntp_gettime", /* 248 */ 3687c478bd9Sstevel@tonic-gate "ntp_adjtime", /* 249 */ 3697c478bd9Sstevel@tonic-gate "lwp_mutex_unlock", /* 250 */ 3707c478bd9Sstevel@tonic-gate "lwp_mutex_trylock", /* 251 */ 371883492d5Sraf "lwp_mutex_register", /* 252 */ 3727c478bd9Sstevel@tonic-gate "cladm", /* 253 */ 3739acbbeafSnn "uucopy", /* 254 */ 3747c478bd9Sstevel@tonic-gate "umount2" /* 255 */ 3757c478bd9Sstevel@tonic-gate }; 3767c478bd9Sstevel@tonic-gate 3777c478bd9Sstevel@tonic-gate /* SYSEND == max syscall number + 1 */ 3787c478bd9Sstevel@tonic-gate #define SYSEND (sizeof (systable) / sizeof (systable[0])) 3797c478bd9Sstevel@tonic-gate 3807c478bd9Sstevel@tonic-gate /* 3817c478bd9Sstevel@tonic-gate * Return the name of a system call. 3827c478bd9Sstevel@tonic-gate * Manufacture a name for unknown system call. 3837c478bd9Sstevel@tonic-gate */ 3847c478bd9Sstevel@tonic-gate char * 3857c478bd9Sstevel@tonic-gate proc_sysname(int sys, char *buf, size_t bufsz) 3867c478bd9Sstevel@tonic-gate { 3877c478bd9Sstevel@tonic-gate const char *name; 3887c478bd9Sstevel@tonic-gate size_t len; 3897c478bd9Sstevel@tonic-gate 3907c478bd9Sstevel@tonic-gate if (bufsz == 0) /* force a program failure */ 3917c478bd9Sstevel@tonic-gate return (NULL); 3927c478bd9Sstevel@tonic-gate 3937c478bd9Sstevel@tonic-gate if (sys >= 0 && sys < SYSEND) 3947c478bd9Sstevel@tonic-gate name = systable[sys]; 3957c478bd9Sstevel@tonic-gate else 3967c478bd9Sstevel@tonic-gate name = NULL; 3977c478bd9Sstevel@tonic-gate 3987c478bd9Sstevel@tonic-gate if (name != NULL) { 3997c478bd9Sstevel@tonic-gate len = strlen(name); 4007c478bd9Sstevel@tonic-gate (void) strncpy(buf, name, bufsz); 4017c478bd9Sstevel@tonic-gate } else { 4027c478bd9Sstevel@tonic-gate len = snprintf(buf, bufsz, "SYS#%d", sys); 4037c478bd9Sstevel@tonic-gate } 4047c478bd9Sstevel@tonic-gate 4057c478bd9Sstevel@tonic-gate if (len >= bufsz) /* ensure null-termination */ 4067c478bd9Sstevel@tonic-gate buf[bufsz-1] = '\0'; 4077c478bd9Sstevel@tonic-gate 4087c478bd9Sstevel@tonic-gate return (buf); 4097c478bd9Sstevel@tonic-gate } 4107c478bd9Sstevel@tonic-gate 4117c478bd9Sstevel@tonic-gate /* 4127c478bd9Sstevel@tonic-gate * Convert a string representation of a fault to the corresponding number. 4137c478bd9Sstevel@tonic-gate */ 4147c478bd9Sstevel@tonic-gate int 4157c478bd9Sstevel@tonic-gate proc_str2flt(const char *str, int *fltnum) 4167c478bd9Sstevel@tonic-gate { 4177c478bd9Sstevel@tonic-gate char *next; 4187c478bd9Sstevel@tonic-gate int i; 4197c478bd9Sstevel@tonic-gate 4207c478bd9Sstevel@tonic-gate i = strtol(str, &next, 0); 4217c478bd9Sstevel@tonic-gate if (i > 0 && i <= PRMAXFAULT && *next == '\0') { 4227c478bd9Sstevel@tonic-gate *fltnum = i; 4237c478bd9Sstevel@tonic-gate return (0); 4247c478bd9Sstevel@tonic-gate } 4257c478bd9Sstevel@tonic-gate 4267c478bd9Sstevel@tonic-gate for (i = 1; i <= PRMAXFAULT; i++) { 4277c478bd9Sstevel@tonic-gate const char *s = rawfltname(i); 4287c478bd9Sstevel@tonic-gate 4297c478bd9Sstevel@tonic-gate if (s && (strcasecmp(s, str) == 0 || 4307c478bd9Sstevel@tonic-gate strcasecmp(s + 3, str) == 0)) { 4317c478bd9Sstevel@tonic-gate *fltnum = i; 4327c478bd9Sstevel@tonic-gate return (0); 4337c478bd9Sstevel@tonic-gate } 4347c478bd9Sstevel@tonic-gate } 4357c478bd9Sstevel@tonic-gate 4367c478bd9Sstevel@tonic-gate return (-1); 4377c478bd9Sstevel@tonic-gate } 4387c478bd9Sstevel@tonic-gate 4397c478bd9Sstevel@tonic-gate /* 4407c478bd9Sstevel@tonic-gate * Convert a string representation of a signal to the signal number. This 4417c478bd9Sstevel@tonic-gate * functionality is already available in libc, but the interface doesn't 4427c478bd9Sstevel@tonic-gate * optionally accept a "SIG" prefix. We strip that first, and then call libc. 4437c478bd9Sstevel@tonic-gate */ 4447c478bd9Sstevel@tonic-gate int 4457c478bd9Sstevel@tonic-gate proc_str2sig(const char *str, int *signum) 4467c478bd9Sstevel@tonic-gate { 4477c478bd9Sstevel@tonic-gate if (strncasecmp(str, "SIG", 3) == 0) 4487c478bd9Sstevel@tonic-gate str += 3; /* skip prefix */ 4497c478bd9Sstevel@tonic-gate 4507c478bd9Sstevel@tonic-gate return (str2sig(str, signum)); 4517c478bd9Sstevel@tonic-gate } 4527c478bd9Sstevel@tonic-gate 4537c478bd9Sstevel@tonic-gate /* 4547c478bd9Sstevel@tonic-gate * Convert a string representation of a system call to the corresponding number. 4557c478bd9Sstevel@tonic-gate * We do this by performing a simple linear search of the table above. 4567c478bd9Sstevel@tonic-gate */ 4577c478bd9Sstevel@tonic-gate int 4587c478bd9Sstevel@tonic-gate proc_str2sys(const char *str, int *sysnum) 4597c478bd9Sstevel@tonic-gate { 4607c478bd9Sstevel@tonic-gate char *next; 4617c478bd9Sstevel@tonic-gate int i; 4627c478bd9Sstevel@tonic-gate 4637c478bd9Sstevel@tonic-gate i = strtol(str, &next, 0); 4647c478bd9Sstevel@tonic-gate if (i > 0 && i <= PRMAXSYS && *next == '\0') { 4657c478bd9Sstevel@tonic-gate *sysnum = i; 4667c478bd9Sstevel@tonic-gate return (0); 4677c478bd9Sstevel@tonic-gate } 4687c478bd9Sstevel@tonic-gate 4697c478bd9Sstevel@tonic-gate for (i = 1; i < SYSEND; i++) { 4707c478bd9Sstevel@tonic-gate if (systable[i] != NULL && strcmp(systable[i], str) == 0) { 4717c478bd9Sstevel@tonic-gate *sysnum = i; 4727c478bd9Sstevel@tonic-gate return (0); 4737c478bd9Sstevel@tonic-gate } 4747c478bd9Sstevel@tonic-gate } 4757c478bd9Sstevel@tonic-gate 4767c478bd9Sstevel@tonic-gate return (-1); 4777c478bd9Sstevel@tonic-gate } 4787c478bd9Sstevel@tonic-gate 4797c478bd9Sstevel@tonic-gate /* 4807c478bd9Sstevel@tonic-gate * Convert a fltset_t to a string representation consisting of canonical 4817c478bd9Sstevel@tonic-gate * machine fault names separated by the given delimeter string. If 4827c478bd9Sstevel@tonic-gate * m is non-zero (TRUE), set members are printed. If m is zero (FALSE), set 4837c478bd9Sstevel@tonic-gate * non-members are printed. If the specified buf is too small to hold the 4847c478bd9Sstevel@tonic-gate * complete formatted set, NULL is returned; otherwise buf is returned. 4857c478bd9Sstevel@tonic-gate */ 4867c478bd9Sstevel@tonic-gate char * 4877c478bd9Sstevel@tonic-gate proc_fltset2str(const fltset_t *set, const char *delim, int m, 488*542a7b7fSCarlos Neira char *buf, size_t len) 4897c478bd9Sstevel@tonic-gate { 4907c478bd9Sstevel@tonic-gate char name[FLT2STR_MAX], *p = buf; 4917c478bd9Sstevel@tonic-gate size_t n; 4927c478bd9Sstevel@tonic-gate int i; 4937c478bd9Sstevel@tonic-gate 4947c478bd9Sstevel@tonic-gate if (buf == NULL || len < 1) { 4957c478bd9Sstevel@tonic-gate errno = EINVAL; 4967c478bd9Sstevel@tonic-gate return (NULL); 4977c478bd9Sstevel@tonic-gate } 4987c478bd9Sstevel@tonic-gate 4997c478bd9Sstevel@tonic-gate buf[0] = '\0'; /* Set first byte to \0 */ 5007c478bd9Sstevel@tonic-gate 5017c478bd9Sstevel@tonic-gate for (i = 1; i <= PRMAXFAULT; i++) { 5027c478bd9Sstevel@tonic-gate if ((prismember(set, i) != 0) ^ (m == 0)) { 5037c478bd9Sstevel@tonic-gate (void) proc_fltname(i, name, sizeof (name)); 5047c478bd9Sstevel@tonic-gate 5057c478bd9Sstevel@tonic-gate if (buf[0] != '\0') 5067c478bd9Sstevel@tonic-gate n = snprintf(p, len, "%s%s", delim, name); 5077c478bd9Sstevel@tonic-gate else 5087c478bd9Sstevel@tonic-gate n = snprintf(p, len, "%s", name); 5097c478bd9Sstevel@tonic-gate 5107c478bd9Sstevel@tonic-gate if (n != strlen(p)) { 5117c478bd9Sstevel@tonic-gate errno = ENAMETOOLONG; /* Output was truncated */ 5127c478bd9Sstevel@tonic-gate return (NULL); 5137c478bd9Sstevel@tonic-gate } 5147c478bd9Sstevel@tonic-gate len -= n; 5157c478bd9Sstevel@tonic-gate p += n; 5167c478bd9Sstevel@tonic-gate } 5177c478bd9Sstevel@tonic-gate } 5187c478bd9Sstevel@tonic-gate return (buf); 5197c478bd9Sstevel@tonic-gate } 5207c478bd9Sstevel@tonic-gate 5217c478bd9Sstevel@tonic-gate /* 5227c478bd9Sstevel@tonic-gate * Convert a sigset_t to a string representation consisting of canonical signal 5237c478bd9Sstevel@tonic-gate * names (without the SIG prefix). Parameters and return values analogous to 5247c478bd9Sstevel@tonic-gate * proc_fltset2str(). 5257c478bd9Sstevel@tonic-gate */ 5267c478bd9Sstevel@tonic-gate char * 5277c478bd9Sstevel@tonic-gate proc_sigset2str(const sigset_t *set, const char *delim, int m, 528*542a7b7fSCarlos Neira char *buf, size_t len) 5297c478bd9Sstevel@tonic-gate { 5307c478bd9Sstevel@tonic-gate char name[SIG2STR_MAX], *p = buf; 5317c478bd9Sstevel@tonic-gate size_t n; 5327c478bd9Sstevel@tonic-gate int i; 5337c478bd9Sstevel@tonic-gate 5347c478bd9Sstevel@tonic-gate if (buf == NULL || len < 1) { 5357c478bd9Sstevel@tonic-gate errno = EINVAL; 5367c478bd9Sstevel@tonic-gate return (NULL); 5377c478bd9Sstevel@tonic-gate } 5387c478bd9Sstevel@tonic-gate 5397c478bd9Sstevel@tonic-gate m = (m != 0); /* Make sure m is 0 or 1 */ 5407c478bd9Sstevel@tonic-gate buf[0] = '\0'; /* Set first byte to \0 */ 5417c478bd9Sstevel@tonic-gate 5427c478bd9Sstevel@tonic-gate /* 5437c478bd9Sstevel@tonic-gate * Unlike proc_fltset2str() and proc_sysset2str(), we don't loop 5447c478bd9Sstevel@tonic-gate * until i <= NSIG here, because sigismember() rejects i == NSIG. 5457c478bd9Sstevel@tonic-gate */ 5467c478bd9Sstevel@tonic-gate for (i = 1; i < NSIG; i++) { 5477c478bd9Sstevel@tonic-gate if (sigismember(set, i) == m) { 5487c478bd9Sstevel@tonic-gate (void) sig2str(i, name); 5497c478bd9Sstevel@tonic-gate 5507c478bd9Sstevel@tonic-gate if (buf[0] != '\0') 5517c478bd9Sstevel@tonic-gate n = snprintf(p, len, "%s%s", delim, name); 5527c478bd9Sstevel@tonic-gate else 5537c478bd9Sstevel@tonic-gate n = snprintf(p, len, "%s", name); 5547c478bd9Sstevel@tonic-gate 5557c478bd9Sstevel@tonic-gate if (n != strlen(p)) { 5567c478bd9Sstevel@tonic-gate errno = ENAMETOOLONG; /* Output was truncated */ 5577c478bd9Sstevel@tonic-gate return (NULL); 5587c478bd9Sstevel@tonic-gate } 5597c478bd9Sstevel@tonic-gate 5607c478bd9Sstevel@tonic-gate len -= n; 5617c478bd9Sstevel@tonic-gate p += n; 5627c478bd9Sstevel@tonic-gate } 5637c478bd9Sstevel@tonic-gate } 5647c478bd9Sstevel@tonic-gate 5657c478bd9Sstevel@tonic-gate return (buf); 5667c478bd9Sstevel@tonic-gate } 5677c478bd9Sstevel@tonic-gate 5687c478bd9Sstevel@tonic-gate /* 5697c478bd9Sstevel@tonic-gate * Convert a sysset_t to a string representation consisting of canonical system 5707c478bd9Sstevel@tonic-gate * call names. Parameters and return values analogous to proc_fltset2str(). 5717c478bd9Sstevel@tonic-gate */ 5727c478bd9Sstevel@tonic-gate char * 5737c478bd9Sstevel@tonic-gate proc_sysset2str(const sysset_t *set, const char *delim, int m, 574*542a7b7fSCarlos Neira char *buf, size_t len) 5757c478bd9Sstevel@tonic-gate { 5767c478bd9Sstevel@tonic-gate char name[SYS2STR_MAX], *p = buf; 5777c478bd9Sstevel@tonic-gate size_t n; 5787c478bd9Sstevel@tonic-gate int i; 5797c478bd9Sstevel@tonic-gate 5807c478bd9Sstevel@tonic-gate if (buf == NULL || len < 1) { 5817c478bd9Sstevel@tonic-gate errno = EINVAL; 5827c478bd9Sstevel@tonic-gate return (NULL); 5837c478bd9Sstevel@tonic-gate } 5847c478bd9Sstevel@tonic-gate 5857c478bd9Sstevel@tonic-gate buf[0] = '\0'; /* Set first byte to \0 */ 5867c478bd9Sstevel@tonic-gate 5877c478bd9Sstevel@tonic-gate for (i = 1; i <= PRMAXSYS; i++) { 5887c478bd9Sstevel@tonic-gate if ((prismember(set, i) != 0) ^ (m == 0)) { 5897c478bd9Sstevel@tonic-gate (void) proc_sysname(i, name, sizeof (name)); 5907c478bd9Sstevel@tonic-gate 5917c478bd9Sstevel@tonic-gate if (buf[0] != '\0') 5927c478bd9Sstevel@tonic-gate n = snprintf(p, len, "%s%s", delim, name); 5937c478bd9Sstevel@tonic-gate else 5947c478bd9Sstevel@tonic-gate n = snprintf(p, len, "%s", name); 5957c478bd9Sstevel@tonic-gate 5967c478bd9Sstevel@tonic-gate if (n != strlen(p)) { 5977c478bd9Sstevel@tonic-gate errno = ENAMETOOLONG; /* Output was truncated */ 5987c478bd9Sstevel@tonic-gate return (NULL); 5997c478bd9Sstevel@tonic-gate } 6007c478bd9Sstevel@tonic-gate len -= n; 6017c478bd9Sstevel@tonic-gate p += n; 6027c478bd9Sstevel@tonic-gate } 6037c478bd9Sstevel@tonic-gate } 6047c478bd9Sstevel@tonic-gate return (buf); 6057c478bd9Sstevel@tonic-gate } 6067c478bd9Sstevel@tonic-gate 6077c478bd9Sstevel@tonic-gate /* 6087c478bd9Sstevel@tonic-gate * Convert a string representation of a fault set (names separated by 6097c478bd9Sstevel@tonic-gate * one or more of the given delimeters) to a fltset_t. 6107c478bd9Sstevel@tonic-gate * If m is non-zero (TRUE), members of the string representation are set. 6117c478bd9Sstevel@tonic-gate * If m is zero (FALSE), non-members of the string representation are set. 6127c478bd9Sstevel@tonic-gate * This function returns NULL for success. Otherwise it returns a pointer 6137c478bd9Sstevel@tonic-gate * to the token of the string that couldn't be identified as a string 6147c478bd9Sstevel@tonic-gate * representation of a fault. 6157c478bd9Sstevel@tonic-gate */ 6167c478bd9Sstevel@tonic-gate char * 6177c478bd9Sstevel@tonic-gate proc_str2fltset(const char *s, const char *delim, int m, fltset_t *set) 6187c478bd9Sstevel@tonic-gate { 61923a1cceaSRoger A. Faulkner char *p, *q, *t; 6207c478bd9Sstevel@tonic-gate int flt; 6217c478bd9Sstevel@tonic-gate 6227c478bd9Sstevel@tonic-gate if (m) { 6237c478bd9Sstevel@tonic-gate premptyset(set); 6247c478bd9Sstevel@tonic-gate } else { 6257c478bd9Sstevel@tonic-gate prfillset(set); 6267c478bd9Sstevel@tonic-gate } 6277c478bd9Sstevel@tonic-gate 62823a1cceaSRoger A. Faulkner t = strdupa(s); 6297c478bd9Sstevel@tonic-gate 6307c478bd9Sstevel@tonic-gate for (p = strtok_r(t, delim, &q); p != NULL; 6317c478bd9Sstevel@tonic-gate p = strtok_r(NULL, delim, &q)) { 6327c478bd9Sstevel@tonic-gate if (proc_str2flt(p, &flt) == -1) { 6337c478bd9Sstevel@tonic-gate errno = EINVAL; 6347c478bd9Sstevel@tonic-gate return ((char *)s + (p - t)); 6357c478bd9Sstevel@tonic-gate } 6367c478bd9Sstevel@tonic-gate if (m) 6377c478bd9Sstevel@tonic-gate praddset(set, flt); 6387c478bd9Sstevel@tonic-gate else 6397c478bd9Sstevel@tonic-gate prdelset(set, flt); 6407c478bd9Sstevel@tonic-gate } 6417c478bd9Sstevel@tonic-gate return (NULL); 6427c478bd9Sstevel@tonic-gate } 6437c478bd9Sstevel@tonic-gate 6447c478bd9Sstevel@tonic-gate /* 6457c478bd9Sstevel@tonic-gate * Convert a string representation of a signal set (names with or without the 6467c478bd9Sstevel@tonic-gate * SIG prefix separated by one or more of the given delimeters) to a sigset_t. 6477c478bd9Sstevel@tonic-gate * Parameters and return values analogous to proc_str2fltset(). 6487c478bd9Sstevel@tonic-gate */ 6497c478bd9Sstevel@tonic-gate char * 6507c478bd9Sstevel@tonic-gate proc_str2sigset(const char *s, const char *delim, int m, sigset_t *set) 6517c478bd9Sstevel@tonic-gate { 65223a1cceaSRoger A. Faulkner char *p, *q, *t; 6537c478bd9Sstevel@tonic-gate int sig; 6547c478bd9Sstevel@tonic-gate 6557c478bd9Sstevel@tonic-gate if (m) { 6567c478bd9Sstevel@tonic-gate premptyset(set); 6577c478bd9Sstevel@tonic-gate } else { 6587c478bd9Sstevel@tonic-gate prfillset(set); 6597c478bd9Sstevel@tonic-gate } 6607c478bd9Sstevel@tonic-gate 66123a1cceaSRoger A. Faulkner t = strdupa(s); 6627c478bd9Sstevel@tonic-gate 6637c478bd9Sstevel@tonic-gate for (p = strtok_r(t, delim, &q); p != NULL; 6647c478bd9Sstevel@tonic-gate p = strtok_r(NULL, delim, &q)) { 6657c478bd9Sstevel@tonic-gate if (proc_str2sig(p, &sig) == -1) { 6667c478bd9Sstevel@tonic-gate errno = EINVAL; 6677c478bd9Sstevel@tonic-gate return ((char *)s + (p - t)); 6687c478bd9Sstevel@tonic-gate } 6697c478bd9Sstevel@tonic-gate if (m) 6707c478bd9Sstevel@tonic-gate praddset(set, sig); 6717c478bd9Sstevel@tonic-gate else 6727c478bd9Sstevel@tonic-gate prdelset(set, sig); 6737c478bd9Sstevel@tonic-gate } 6747c478bd9Sstevel@tonic-gate return (NULL); 6757c478bd9Sstevel@tonic-gate } 6767c478bd9Sstevel@tonic-gate 6777c478bd9Sstevel@tonic-gate /* 6787c478bd9Sstevel@tonic-gate * Convert a string representation of a system call set (names separated by 6797c478bd9Sstevel@tonic-gate * one or more of the given delimeters) to a sysset_t. Parameters and return 6807c478bd9Sstevel@tonic-gate * values analogous to proc_str2fltset(). 6817c478bd9Sstevel@tonic-gate */ 6827c478bd9Sstevel@tonic-gate char * 6837c478bd9Sstevel@tonic-gate proc_str2sysset(const char *s, const char *delim, int m, sysset_t *set) 6847c478bd9Sstevel@tonic-gate { 68523a1cceaSRoger A. Faulkner char *p, *q, *t; 6867c478bd9Sstevel@tonic-gate int sys; 6877c478bd9Sstevel@tonic-gate 6887c478bd9Sstevel@tonic-gate if (m) { 6897c478bd9Sstevel@tonic-gate premptyset(set); 6907c478bd9Sstevel@tonic-gate } else { 6917c478bd9Sstevel@tonic-gate prfillset(set); 6927c478bd9Sstevel@tonic-gate } 6937c478bd9Sstevel@tonic-gate 69423a1cceaSRoger A. Faulkner t = strdupa(s); 6957c478bd9Sstevel@tonic-gate 6967c478bd9Sstevel@tonic-gate for (p = strtok_r(t, delim, &q); p != NULL; 6977c478bd9Sstevel@tonic-gate p = strtok_r(NULL, delim, &q)) { 6987c478bd9Sstevel@tonic-gate if (proc_str2sys(p, &sys) == -1) { 6997c478bd9Sstevel@tonic-gate errno = EINVAL; 7007c478bd9Sstevel@tonic-gate return ((char *)s + (p - t)); 7017c478bd9Sstevel@tonic-gate } 7027c478bd9Sstevel@tonic-gate if (m) 7037c478bd9Sstevel@tonic-gate praddset(set, sys); 7047c478bd9Sstevel@tonic-gate else 7057c478bd9Sstevel@tonic-gate prdelset(set, sys); 7067c478bd9Sstevel@tonic-gate } 7077c478bd9Sstevel@tonic-gate return (NULL); 7087c478bd9Sstevel@tonic-gate } 709*542a7b7fSCarlos Neira 710*542a7b7fSCarlos Neira /* 711*542a7b7fSCarlos Neira * Returns a string representation of a process data model. 712*542a7b7fSCarlos Neira * See <sys/procfs_isa.h> for possible values. 713*542a7b7fSCarlos Neira */ 714*542a7b7fSCarlos Neira char * 715*542a7b7fSCarlos Neira proc_dmodelname(int dmodel, char *buf, size_t bufsz) 716*542a7b7fSCarlos Neira { 717*542a7b7fSCarlos Neira static const char *const dmdls[] = { 718*542a7b7fSCarlos Neira "PR_MODEL_UNKNOWN", 719*542a7b7fSCarlos Neira "PR_MODEL_ILP32", 720*542a7b7fSCarlos Neira "PR_MODEL_LP64", 721*542a7b7fSCarlos Neira NULL 722*542a7b7fSCarlos Neira }; 723*542a7b7fSCarlos Neira size_t len; 724*542a7b7fSCarlos Neira 725*542a7b7fSCarlos Neira if (bufsz == 0) 726*542a7b7fSCarlos Neira return (NULL); 727*542a7b7fSCarlos Neira 728*542a7b7fSCarlos Neira if (dmodel > PR_MODEL_LP64 || dmodel < PR_MODEL_UNKNOWN) { 729*542a7b7fSCarlos Neira len = snprintf(buf, bufsz, "DMODEL#%d", dmodel); 730*542a7b7fSCarlos Neira } else { 731*542a7b7fSCarlos Neira len = strlen(dmdls[dmodel]); 732*542a7b7fSCarlos Neira (void) strncpy(buf, dmdls[dmodel], bufsz); 733*542a7b7fSCarlos Neira } 734*542a7b7fSCarlos Neira 735*542a7b7fSCarlos Neira if (len >= bufsz) 736*542a7b7fSCarlos Neira buf[bufsz-1] = '\0'; 737*542a7b7fSCarlos Neira 738*542a7b7fSCarlos Neira return (buf); 739*542a7b7fSCarlos Neira } 740