summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorola.soder@axis.com <ola.soder@axis.com>2022-02-10 20:21:04 +0000
committerBram Moolenaar <Bram@vim.org>2022-02-10 20:21:04 +0000
commit949b35d83b69a7eab7b280b5af6940da9aedad43 (patch)
tree34325547a4b0503d0e1e7fe991df54d0602e37e2
parent560dff49c0095111fc96b4b8dd7f4d269aba9473 (diff)
downloadvim-git-8.2.4340.tar.gz
patch 8.2.4340: Amiga: mch_can_exe() is not implementedv8.2.4340
Problem: Amiga: mch_can_exe() is not implemented. Solution: Implement mch_can_exe() for Amiga OS 4. (Ola Söder, closes #9731)
-rw-r--r--src/os_amiga.c44
-rw-r--r--src/version.c2
2 files changed, 44 insertions, 2 deletions
diff --git a/src/os_amiga.c b/src/os_amiga.c
index e9d622141..c6d9c253f 100644
--- a/src/os_amiga.c
+++ b/src/os_amiga.c
@@ -891,8 +891,48 @@ mch_mkdir(char_u *name)
int
mch_can_exe(char_u *name, char_u **path, int use_path)
{
- // TODO
- return -1;
+ int exe = -1;
+#ifdef __amigaos4__
+ // Load file sections using elf.library or hunk.library.
+ BPTR seg = LoadSeg(name);
+
+ if (seg && GetSegListInfoTags(seg, GSLI_Native, NULL, TAG_DONE) !=
+ GetSegListInfoTags(seg, GSLI_68KHUNK, NULL, TAG_DONE))
+ {
+ // Test if file permissions allow execution.
+ struct ExamineData *exd = ExamineObjectTags(EX_StringNameInput, name);
+
+ exe = (exd && !(exd->Protection & EXDF_NO_EXECUTE)) ? 1 : 0;
+ FreeDosObject(DOS_EXAMINEDATA, exd);
+ }
+ else
+ {
+ exe = 0;
+ }
+
+ UnLoadSeg(seg);
+
+ // Search for executable in path if applicable.
+ if (!exe && use_path)
+ {
+ // Save current working dir.
+ BPTR cwd = GetCurrentDir();
+ struct PathNode *head = DupCmdPathList(NULL);
+
+ // For each entry, recur to check for executable.
+ for(struct PathNode *tail = head; !exe && tail;
+ tail = (struct PathNode *) BADDR(tail->pn_Next))
+ {
+ SetCurrentDir(tail->pn_Lock);
+ exe = mch_can_exe(name, path, 0);
+ }
+
+ // Go back to where we were.
+ FreeCmdPathList(head);
+ SetCurrentDir(cwd);
+ }
+#endif
+ return exe;
}
/*
diff --git a/src/version.c b/src/version.c
index 6b6d3cc20..42e6a4ca1 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4340,
+/**/
4339,
/**/
4338,