nix
nix copied to clipboard
Add a trait for non-path C string?
I am thinking about adding another trait to represent string, the definition will be same as our NixPath trait, and these 2 traits only differ in semantics, NixPath is for path, this new trait is for string.
By adding this trait, we split "C string" (C does not have a string type, it is only a sequence of chars followed by a NUL) into 2 categories by semantics:
- path
- string
Currently, it will be used in 2 interfaces if added:
-
The
identargument ofopenlog()on non-Linux systemshttps://github.com/nix-rust/nix/blob/0c40b8d6e4ae7f9f55a9eec1f8b118dcd7db7ec1/src/syslog.rs#L45-L47
From man page:
The string pointed to by
identis prepended to every message, and is typically set to the program name. -
The
pathargument ofposix_spawnp()https://github.com/nix-rust/nix/blob/0c40b8d6e4ae7f9f55a9eec1f8b118dcd7db7ec1/src/spawn.rs#L396-L397
It is the name of the program that the spawned child process will execute
This argument should not be called
path, I will rename it tofile
Alternative approaches
-
Just use the
NixPathtraitIt will definitely work, though it will feel weird semantically due to the
Pathin its name. Or maybe we can rename the trait to something likeNixCString? -
Use
S: AsRef<OsStr>openlog()currently uses this approach, after converting it to&OsStrwe can useNixPathunder the hood, so it is convenient:<OsStr as NixPath>::with_nix_path(os_str.as_ref(), |c_str| { // do something with c_str });The only flaw of this method IMHO is that users cannot use
&CStrbecauseCStris notAsRef<OsStr>, but&CStrshould be allowed.