Browse Source

Fix test condition for Columns (single, explicit)

master
boB Rudis 3 years ago
parent
commit
6e3517fbff
No known key found for this signature in database GPG Key ID: 1D7529BE14E2BBA9
  1. 2
      Makefile
  2. 45
      archinfo.c

2
Makefile

@ -27,5 +27,5 @@ test: archinfo
@./archinfo --columns | grep -q tccd && echo "Columns: PASSED (list, explicit)" || echo "Columns: FAILED (list, explicit)" @./archinfo --columns | grep -q tccd && echo "Columns: PASSED (list, explicit)" || echo "Columns: FAILED (list, explicit)"
@./archinfo --json | grep -q 'tccd"}' && echo " JSON: PASSED (list)" || echo " JSON: FAILED (list)" @./archinfo --json | grep -q 'tccd"}' && echo " JSON: PASSED (list)" || echo " JSON: FAILED (list)"
@(./archinfo --pid `pgrep keyboardservicesd` | grep -q '64') && echo "Columns: PASSED (single)" || echo "Columns: FAILED (single)" @(./archinfo --pid `pgrep keyboardservicesd` | grep -q '64') && echo "Columns: PASSED (single)" || echo "Columns: FAILED (single)"
@(./archinfo --columns --pid `pgrep keyboardservicesd` | grep -q '"}') && echo "Columns: PASSED (single, explicit)" || echo "Columns: FAILED (single, explicit)" @(./archinfo --columns --pid `pgrep keyboardservicesd` | grep -q '64') && echo "Columns: PASSED (single, explicit)" || echo "Columns: FAILED (single, explicit)"
@(./archinfo --json --pid `pgrep keyboardservicesd` | grep -q '"}') && echo " JSON: PASSED (single)" || echo " JSON: FAILED (single)" @(./archinfo --json --pid `pgrep keyboardservicesd` | grep -q '"}') && echo " JSON: PASSED (single)" || echo " JSON: FAILED (single)"

45
archinfo.c

@ -9,14 +9,18 @@
#include <sys/sysctl.h> #include <sys/sysctl.h>
#include <libgen.h> #include <libgen.h>
#define noErr 0
#define VERSION "0.4.0" #define VERSION "0.4.0"
#define noErr 0
#define DEFAULT_BUFFER_SIZE 4096
#define SYSCTL_ERROR 1 #define SYSCTL_ERROR 1
#define is_match(x) (x == 0)
enum fmt { JSON=0, COLUMNS }; enum fmt { JSON=0, COLUMNS };
enum show { ALL=0, ARM64, X86_64 }; enum show { ALL=0, ARM64, X86_64 };
static int maxArgumentSize = 0; static int max_arg_size = 0;
typedef struct ProcInfo { typedef struct ProcInfo {
bool ok; bool ok;
@ -56,7 +60,7 @@ static char *arch_info(pid_t pid) {
if(noErr != sysctl(mib, (u_int)length, &procInfo, &size, NULL, 0)) return("arm64"); //get proc info if(noErr != sysctl(mib, (u_int)length, &procInfo, &size, NULL, 0)) return("arm64"); //get proc info
//'P_TRANSLATED' set? set architecture to 'Intel' //'P_TRANSLATED' set? set architecture to 'x86_64'
return( (P_TRANSLATED == (P_TRANSLATED & procInfo.kp_proc.p_flag)) ? "x86_64" : "arm64"); return( (P_TRANSLATED == (P_TRANSLATED & procInfo.kp_proc.p_flag)) ? "x86_64" : "arm64");
} }
@ -65,21 +69,26 @@ static char *arch_info(pid_t pid) {
} }
// retrieve process info
procinfo proc_info(pid_t pid) { procinfo proc_info(pid_t pid) {
size_t size = maxArgumentSize; size_t size = max_arg_size;
procinfo p; procinfo p;
int mib[3] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL }; int mib[3] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL };
struct kinfo_proc *info; struct kinfo_proc *info;
size_t length; size_t length;
int count; int count;
// get size for buffer
(void)sysctl(mib, 3, NULL, &length, NULL, 0); (void)sysctl(mib, 3, NULL, &length, NULL, 0);
char* buffer = (char *)calloc(length, sizeof(char)); char* buffer = (char *)calloc(length, sizeof(char));
// get the info
if (sysctl((int[]){ CTL_KERN, KERN_PROCARGS2, pid }, 3, buffer, &size, NULL, 0) == 0) { if (sysctl((int[]){ CTL_KERN, KERN_PROCARGS2, pid }, 3, buffer, &size, NULL, 0) == 0) {
// copy the info
p.ok = TRUE; p.ok = TRUE;
p.name = buffer; p.name = buffer;
strncpy(p.arch, arch_info(pid), 10); strncpy(p.arch, arch_info(pid), 10);
@ -93,6 +102,8 @@ procinfo proc_info(pid_t pid) {
} }
// output one line of process info with architecture info
void output_one(enum fmt output_type, pid_t pid, procinfo p, bool only_basename) { void output_one(enum fmt output_type, pid_t pid, procinfo p, bool only_basename) {
if (output_type == COLUMNS) { if (output_type == COLUMNS) {
printf( printf(
@ -111,6 +122,9 @@ void output_one(enum fmt output_type, pid_t pid, procinfo p, bool only_basename)
} }
} }
// walk through process list, get PID and name, then pass that on to output_one() to
// grab the architecture and do the actual output
int enumerate_processes(enum fmt output_type, enum show to_show, bool only_basename) { int enumerate_processes(enum fmt output_type, enum show to_show, bool only_basename) {
int mib[3] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL }; int mib[3] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL };
@ -118,30 +132,35 @@ int enumerate_processes(enum fmt output_type, enum show to_show, bool only_basen
size_t length; size_t length;
int count; int count;
// get the running process list
if (sysctl(mib, 3, NULL, &length, NULL, 0) < 0) return(SYSCTL_ERROR); if (sysctl(mib, 3, NULL, &length, NULL, 0) < 0) return(SYSCTL_ERROR);
// make some room for results
if (!(info = calloc(length, sizeof(char)))) return(SYSCTL_ERROR); if (!(info = calloc(length, sizeof(char)))) return(SYSCTL_ERROR);
// get the results
if (sysctl(mib, 3, info, &length, NULL, 0) < 0) { if (sysctl(mib, 3, info, &length, NULL, 0) < 0) {
free(info); free(info);
return(SYSCTL_ERROR); return(SYSCTL_ERROR);
} }
// how many results?
count = (int)(length / sizeof(struct kinfo_proc)); count = (int)(length / sizeof(struct kinfo_proc));
// for each result
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
pid_t pid = info[i].kp_proc.p_pid; pid_t pid = info[i].kp_proc.p_pid; // get PID
if (pid == 0) continue; if (pid == 0) continue;
procinfo p = proc_info(pid); procinfo p = proc_info(pid); // get process info
if (p.ok) { if (p.ok) {
if ( if (
(to_show == ALL) || (to_show == ALL) ||
((to_show == ARM64) && (strncmp("arm", p.arch, 3) == 0)) || ((to_show == ARM64) && is_match(strncmp("arm", p.arch, 3))) ||
((to_show == X86_64) && (strncmp("x86", p.arch, 3) == 0)) ((to_show == X86_64) && is_match(strncmp("x86", p.arch, 3)))
) { ) {
output_one(output_type, pid, p, only_basename); output_one(output_type, pid, p, only_basename);
} }
@ -156,6 +175,8 @@ int enumerate_processes(enum fmt output_type, enum show to_show, bool only_basen
} }
// call to display cmdline tool help
void help() { void help() {
printf("archinfo %s\n", VERSION); printf("archinfo %s\n", VERSION);
@ -179,11 +200,11 @@ void help() {
void init() { void init() {
if (maxArgumentSize == 0) { if (max_arg_size == 0) {
size_t size = sizeof(maxArgumentSize); size_t size = sizeof(max_arg_size);
if (sysctl((int[]) { CTL_KERN, KERN_ARGMAX }, 2, &maxArgumentSize, &size, NULL, 0) == -1) { if (sysctl((int[]) { CTL_KERN, KERN_ARGMAX }, 2, &max_arg_size, &size, NULL, 0) == -1) {
perror("sysctl argument size"); perror("sysctl argument size");
maxArgumentSize = 4096; // Default max_arg_size = DEFAULT_BUFFER_SIZE;
} }
} }

Loading…
Cancel
Save