changeset 27628:6ece6dd69583 v8.2.4340

patch 8.2.4340: Amiga: mch_can_exe() is not implemented Commit: https://github.com/vim/vim/commit/949b35d83b69a7eab7b280b5af6940da9aedad43 Author: ola.soder@axis.com <ola.soder@axis.com> Date: Thu Feb 10 20:21:04 2022 +0000 patch 8.2.4340: Amiga: mch_can_exe() is not implemented Problem: Amiga: mch_can_exe() is not implemented. Solution: Implement mch_can_exe() for Amiga OS 4. (Ola S?der, closes https://github.com/vim/vim/issues/9731)
author Bram Moolenaar <Bram@vim.org>
date Thu, 10 Feb 2022 21:30:02 +0100
parents 6fbecfe4fe96
children fc05930fabdf
files src/os_amiga.c src/version.c
diffstat 2 files changed, 44 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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;
 }
 
 /*
--- 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,