Zig 0.17.0-dev (Split by item) This is an example of documentation generated by
ZigDoc , an alternative to Zig's built-in
Auto Doc feature. See also
examples in other modes/formats . The project being documented here (as the example) is the Zig standard library.
std › Io › Uring › execv Private Function execv Doc Source Private Function std.Io.Uring.execv
fn execv (
sync : *CancelRegion .Sync ,
arg0_expand : process .ArgExpansion ,
file : [*:0 ]const u8 ,
child_argv : [*:null ]?[*:0 ]const u8 ,
env_block : process .Environ .PosixBlock ,
PATH : []const u8 ,
) process .ReplaceError Params sync : *CancelRegion .Sync arg0_expand : process .ArgExpansion file : [*:0 ]const u8 child_argv : [*:null ]?[*:0 ]const u8 env_block : process .Environ .PosixBlock PATH : []const u8 File Io/Uring.zig: 4626
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673 fn execv (
sync : *CancelRegion .Sync ,
arg0_expand : process .ArgExpansion ,
file : [*:0 ]const u8 ,
child_argv : [*:null ]?[*:0 ]const u8 ,
env_block : process .Environ .PosixBlock ,
PATH : []const u8 ,
) process .ReplaceError {
const file_slice = std .mem .sliceTo (file , 0 );
if (std .mem .findScalar (u8 , file_slice , '/' ) != null )
return execvPath (sync , file , child_argv , env_block );
// Use of PATH_MAX here is valid as the path_buf will be passed
// directly to the operating system in posixExecvPath.
var path_buf : [PATH_MAX ]u8 = undefined ;
var it = std .mem .tokenizeScalar (u8 , PATH , ':' );
var seen_eacces = false ;
var err : process .ReplaceError = error .FileNotFound ;
// In case of expanding arg0 we must put it back if we return with an error.
const prev_arg0 = child_argv [0 ];
defer switch (arg0_expand ) {
.expand => child_argv [0 ] = prev_arg0 ,
.no_expand => {},
};
while (it .next ()) |search_path | {
const path_len = search_path .len + file_slice .len + 1 ;
if (path_buf .len < path_len + 1 ) return error .NameTooLong ;
@memcpy (path_buf [0 ..search_path .len ], search_path );
path_buf [search_path .len ] = '/' ;
@memcpy (path_buf [search_path .len + 1 ..][0 ..file_slice .len ], file_slice );
path_buf [path_len ] = 0 ;
const full_path = path_buf [0 ..path_len :0 ].ptr ;
switch (arg0_expand ) {
.expand => child_argv [0 ] = full_path ,
.no_expand => {},
}
err = execvPath (sync , full_path , child_argv , env_block );
switch (err ) {
error .AccessDenied => seen_eacces = true ,
error .FileNotFound , error .NotDir => {},
else => |e | return e ,
}
}
if (seen_eacces ) return error .AccessDenied ;
return err ;
}