An open API service indexing awesome lists of open source software.

https://github.com/getargv/getargv.cs

C# bindings for libgetargv
https://github.com/getargv/getargv.cs

Last synced: 6 months ago
JSON representation

C# bindings for libgetargv

Awesome Lists containing this project

README

          

getargv

[![.NET](https://github.com/getargv/getargv.cs/actions/workflows/dotnet.yml/badge.svg)](https://github.com/getargv/getargv.cs/actions/workflows/dotnet.yml)

`libgetargv` is a library that allows you to get the arguments that were passed to another running process on macOS. It is intended to provide roughly the same functionality as reading from `/proc//cmdline` on Linux. On macOS this is done by parsing the output of the `KERN_PROCARGS2` sysctl, which is very often implemented [incorrectly](https://getargv.narzt.cam/hallofshame.html), due to the overlooked possibility of leading empty arguments passed to the target process. This package is the C# bindings for the `libgetargv` library.

## Permissions

`libgetargv` can only see processes running as the same user by default, so be sure your process runs as the desired user (`setuid`, [`launchd.plist`](x-man-page://launchd.plist), [`sudo`](x-man-page://sudo)) or can [elevate privileges](https://developer.apple.com/library/archive/documentation/Security/Conceptual/SecureCodingGuide/Articles/AccessControl.html); n.b. elevating privileges safely is [extremely complicated](https://developer.apple.com/forums/thread/708765), and will be a target of privilege escalation attacks on macOS so be extremely careful if you go this route, better to defer to the user to elevate privileges for you as needed.

## System Requirements

macOS is required as this is a macOS specific `sysctl`, even BSD does not implement it. Your system must support `sysctl` and `KERN_PROCARGS2`, which probably means macOS [10.3](https://github.com/CamJN/xnu/blob/b52f6498893f78b034e2e00b86a3e146c3720649/bsd/sys/sysctl.h#L332) or later, though I haven't tested versions older than 10.7. You'll also need a non-ancient clang (c99 is required) or you'll have to override the compiler flags with `CC`, `EXTRA_CPPFLAGS`, and `EXTRA_CFLAGS`.

## Building `getargv.cs`

To make `getargv.cs`:

- Install `libgetargv` to your system (see below).
- Clone this repo and run `dotnet build` or
- Add a `` entry to the `` property in your `.csproj` file: ``

## Installing `libgetargv`

To get access to `libgetargv`, sign up for an appropriate [sponsorship tier](https://github.com/sponsors/CamJN).

Clone the `libgetargv` repo: `git clone https://github.com/getargv/getargv.git`.

Running `make install_dylib`, installs the library to the `/usr/local/` prefix by default; you can change the install location with the `PREFIX` `make` variable: `make PREFIX=/opt install_dylib`.

I'm working on building binary artifacts to install without compilation, using `pkg` installers, however even once that's done, depending on your system, it may still be necessary to compile from source; eg. if you have built your own xnu kernel with a custom `PID_MAX` value.

## Building `libgetargv`
I've built `libgetargv` on each version of macOS from 10.7 on using only the CLT package, not the full Xcode install. If you need to override variables, do so inside the `make` command, eg: `make EXTRA_CPPFLAGS=-DMACRO EXTRA_CFLAGS=-std=c17 dylib`. Since c# did not exist when 10.6 was current, that should not be a concern for this project.