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
- Host: GitHub
- URL: https://github.com/getargv/getargv.cs
- Owner: getargv
- License: bsd-3-clause
- Created: 2023-04-27T16:29:41.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2025-10-03T19:27:52.000Z (9 months ago)
- Last Synced: 2025-10-03T21:30:29.877Z (9 months ago)
- Language: C#
- Homepage: https://getargv.github.io/getargv.cs/Getargv.xml
- Size: 245 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README

[](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.