mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-08-08 19:00:27 +00:00
[metal] Use "/proc/self/exe" as program name & symbol to yoink
for support for opening argv[0]
This commit is contained in:
parent
484da042ab
commit
7409100874
5 changed files with 11 additions and 9 deletions
|
@ -17,6 +17,7 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/calls/metalfile.internal.h"
|
||||
#include "libc/calls/syscall-sysv.internal.h"
|
||||
#include "libc/dce.h"
|
||||
#include "libc/errno.h"
|
||||
|
@ -76,10 +77,14 @@ static inline void GetProgramExecutableNameImpl(char *p, char *e) {
|
|||
return;
|
||||
}
|
||||
|
||||
if (IsMetal()) {
|
||||
if (!memccpy(p, APE_COM_NAME, 0, e - p - 1)) e[-1] = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
// if argv[0] exists then turn it into an absolute path. we also try
|
||||
// adding a .com suffix since the ape auto-appends it when resolving
|
||||
if (__argc && (((q = __argv[0]) && !sys_faccessat(AT_FDCWD, q, F_OK, 0)) ||
|
||||
IsMetal() ||
|
||||
((q = StrCat(u.path, __argv[0], ".com")) &&
|
||||
!sys_faccessat(AT_FDCWD, q, F_OK, 0)))) {
|
||||
if (*q != '/') {
|
||||
|
|
|
@ -15,8 +15,6 @@ extern size_t __ape_com_size;
|
|||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
|
||||
#define APE_COM_NAME "/ape.com"
|
||||
#define APE_COM_ALT_NAME "/proc/self/exe"
|
||||
#define APE_COM_URI "file:/proc/self/exe"
|
||||
#define APE_COM_NAME "/proc/self/exe"
|
||||
|
||||
#endif /* COSMOPOLITAN_LIBC_CALLS_METALFILE_INTERNAL_H_ */
|
||||
|
|
|
@ -34,5 +34,5 @@
|
|||
pop %rsi
|
||||
pop %rdi
|
||||
.init.end 101,_init_metalfile
|
||||
APE_COM_URI:
|
||||
.endobj APE_COM_URI,globl,hidden
|
||||
APE_COM_NAME:
|
||||
.endobj APE_COM_NAME,globl,hidden
|
||||
|
|
|
@ -38,8 +38,7 @@
|
|||
int sys_openat_metal(int dirfd, const char *file, int flags, unsigned mode) {
|
||||
int fd;
|
||||
struct MetalFile *state;
|
||||
if (dirfd != AT_FDCWD || (strcmp(file, APE_COM_NAME) &&
|
||||
strcmp(file, APE_COM_ALT_NAME))) return enoent();
|
||||
if (dirfd != AT_FDCWD || strcmp(file, APE_COM_NAME)) return enoent();
|
||||
if (flags != O_RDONLY) return eacces();
|
||||
if (!_weaken(__ape_com_base) || !_weaken(__ape_com_size))
|
||||
return eopnotsupp();
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
#include "libc/zip.h"
|
||||
#include "libc/zipos/zipos.internal.h"
|
||||
|
||||
STATIC_YOINK(APE_COM_URI);
|
||||
STATIC_YOINK(APE_COM_NAME);
|
||||
|
||||
static uint64_t __zipos_get_min_offset(const uint8_t *base,
|
||||
const uint8_t *cdir) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue