rt.ha (1026B)
1 // License: MPL-2.0 2 // (c) 2021 Drew DeVault <sir@cmpwn.com> 3 use rt; 4 5 // Wraps an [[rt::errno]] to produce an [[errors::opaque]]. This is a non-portable 6 // interface which is mainly provided to support internal stdlib requirements. 7 export fn errno(errno: rt::errno) error = { 8 switch (errno) { 9 case rt::ECONNREFUSED => 10 return refused; 11 case rt::ECANCELED => 12 return cancelled; 13 case rt::EOVERFLOW => 14 return overflow; 15 case rt::EACCES => 16 return noaccess; 17 case rt::EINVAL => 18 return invalid; 19 case rt::EEXIST => 20 return exists; 21 case rt::ENOENT => 22 return noentry; 23 case rt::ETIMEDOUT => 24 return timeout; 25 case rt::EBUSY => 26 return busy; 27 case rt::EINTR => 28 return interrupted; 29 case rt::EAGAIN => 30 return again; 31 case => void; 32 }; 33 34 static assert(size(rt::errno) <= size(opaque_data)); 35 let err = opaque { strerror = &rt_strerror, ... }; 36 let ptr = &err.data: *rt::errno; 37 *ptr = errno; 38 return err; 39 }; 40 41 fn rt_strerror(err: *opaque_data) const str = { 42 let err = err: *rt::errno; 43 return rt::strerror(*err); 44 };