Obsolete option --no-sig-create-check.
[gnupg.git] / util / riscos.c
index 6c3bd37..814ec69 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GnuPG is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * GnuPG is distributed in the hope that it will be useful,
@@ -14,8 +14,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #ifndef __RISCOS__C__
@@ -23,9 +22,8 @@
 
 #include <config.h>
 #include <stdlib.h>
-#include <stdarg.h>
-#include <sys/types.h>
-#include <sys/stat.h>
+#include <string.h>
+#include <signal.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <errno.h>
 #include "util.h"
 #include "memory.h"
 
+#include <unixlib/local.h>     /* needed for RISCOSIFY_NO_PROCESS */
 #define __UNIXLIB_INTERNALS
-#include <unixlib/unix.h>
-#include <unixlib/swiparams.h>
+#include <unixlib/swiparams.h> /* needed for MMM_TYPE_* definitions */
 #undef __UNIXLIB_INTERNALS
 
 
+/* static symbols that trigger UnixLib behaviour */
+
+int __riscosify_control = __RISCOSIFY_NO_PROCESS;
+int __feature_imagefs_is_file = 1;
+
+
 /* RISC OS file open descriptor control list */
 
 struct fds_item {
@@ -47,7 +51,7 @@ struct fds_item {
     struct fds_item *next;
 };
 static struct fds_item *fds_list = NULL;
-static int initialized = 0;
+static int fdlist_initialized = 0;
 
 
 /* local RISC OS functions */
@@ -59,10 +63,10 @@ is_read_only(const char *filename)
     
     if (_swix(OS_File, _INR(0,1) | _OUT(0) | _OUT(5),
               17, filename, &type, &attr))
-        log_fatal("Can't get file attributes for %s!\n", filename);
+        log_fatal("Can't get file attributes for file \"%s\"!\n", filename);
     
     if (type == 0)
-        log_fatal("Can't find file %s!\n", filename);
+        log_fatal("Can't find file \"%s\"!\n", filename);
 
     if (_swix(OS_File, _INR(0,1) | _IN(5), 4, filename, attr))
         return 1;
@@ -72,11 +76,28 @@ is_read_only(const char *filename)
 
 /* exported RISC OS functions */
 
-void
-riscos_global_defaults(void)
+int
+riscos_load_module(const char *name, const char * const path[], int fatal)
 {
-    __riscosify_control = __RISCOSIFY_NO_PROCESS;
-    __feature_imagefs_is_file = 1;
+    int i;
+
+    /* Is module already loaded? */
+    if (!_swix(OS_Module, _INR(0,1), 18, name))
+        return 1;
+
+    /* Check all the places where the module could be located */
+    for (i=0; path[i]; ++i)
+        if (!_swix(OS_Module, _INR(0,1), 1, path[i]))
+            return 1;
+
+    /* Can't find module in the default locations */
+    if (fatal)
+        log_fatal("Operation cannot be performed without \"%s\" module!\n",
+                  name);
+    else
+        log_info("Can't load \"%s\" module, continuing anyway!\n", name);
+
+    return 0;
 }
 
 int
@@ -97,28 +118,31 @@ riscos_get_filetype(const char *filename)
 {
     int result;
 
-    if (_swix(OS_File, _INR(0,1) | _OUT(6), 23, filename, &result))
-        log_fatal("Can't get filetype for file %s!\n", filename);
+    if (_swix(OS_File, _INR(0,1) | _OUT(2), 17, filename, &result))
+        log_fatal("Can't get filetype for file \"%s\"!\n", filename);
 
-    return result;
+    if ((result & 0xfff00000) == 0xfff00000)
+        return (result & 0xfff00) >> 8;
+    else
+        return 0;
 }        
 
 void
 riscos_set_filetype_by_number(const char *filename, int type)
 {
     if (_swix(OS_File, _INR(0,2), 18, filename, type))
-        log_fatal("Can't set filetype for file %s!\n"
+        log_fatal("Can't set filetype for file \"%s\"!\n"
                   "Is the file on a read-only file system?\n", filename);
 }        
 
 void
-riscos_set_filetype(const char *filename, const char *mimetype)
+riscos_set_filetype_by_mimetype(const char *filename, const char *mimetype)
 {
     int result;
 
     if (_swix(MimeMap_Translate, _INR(0,2) | _OUT(3),
               MMM_TYPE_MIME, mimetype, MMM_TYPE_RISCOS, &result))
-        log_fatal("Can't translate MIME type %s!\n", mimetype);
+        log_fatal("Can't translate MIME type \"%s\"!\n", mimetype);
 
     riscos_set_filetype_by_number(filename, result);
 }        
@@ -133,7 +157,8 @@ riscos_getpid(void)
 
     if (state)
         if (_swix(Wimp_ReadSysInfo, _IN(0) | _OUT(0), 5, &state))
-            log_fatal("Wimp_ReadSysInfo failed: Can't get task handle (R0=5)!\n");
+            log_fatal("Wimp_ReadSysInfo failed: "
+                      "Can't get task handle (R0=5)!\n");
 
     return (pid_t) state;
 }
@@ -181,7 +206,7 @@ riscos_getchar(void)
 
 #ifdef DEBUG
 void
-dump_fdlist(void)
+riscos_dump_fdlist(void)
 {
     struct fds_item *iter = fds_list;
     printf("List of open file descriptors:\n");
@@ -193,7 +218,7 @@ dump_fdlist(void)
 #endif /* DEBUG */
 
 int
-fdopenfile(const char *filename, const int allow_write)
+riscos_fdopenfile(const char *filename, const int allow_write)
 {
     struct fds_item *h;
     int fd;
@@ -202,15 +227,16 @@ fdopenfile(const char *filename, const int allow_write)
     else
         fd = open(filename, O_RDONLY);
     if (fd == -1)
-        log_error("Can't open file %s: %i, %s!\n", filename, errno, strerror(errno));
+        log_error("Can't open file \"%s\": %i, %s!\n",
+                  filename, errno, strerror(errno));
 
-    if (!initialized) {
-        atexit (close_fds);
-        initialized = 1;
+    if (!fdlist_initialized) {
+        atexit (riscos_close_fds);
+        fdlist_initialized = 1;
     }
 
     h = fds_list;
-    fds_list = (struct fds_item *) m_alloc(sizeof(struct fds_item));
+    fds_list = (struct fds_item *) xmalloc(sizeof(struct fds_item));
     if (!fds_list)
         log_fatal("Can't claim memory for fdopenfile() buffer!\n");
     fds_list->fd = fd;
@@ -220,7 +246,7 @@ fdopenfile(const char *filename, const int allow_write)
 }
 
 void
-close_fds(void)
+riscos_close_fds(void)
 {
     FILE *fp;
     struct fds_item *h = fds_list;
@@ -230,13 +256,13 @@ close_fds(void)
         if (fp)
             fflush(fp);
         close(fds_list->fd);
-        m_free(fds_list);
+        xfree(fds_list);
         fds_list = h;
     }
 }
 
 int
-renamefile(const char *old, const char *new)
+riscos_renamefile(const char *old, const char *new)
 {
     _kernel_oserror *e;
 
@@ -252,25 +278,25 @@ renamefile(const char *old, const char *new)
 }
 
 char *
-gstrans(const char *old)
+riscos_gstrans(const char *old)
 {
     int size = 256, last;
     char *buf, *tmp;
 
-    buf = (char *) m_alloc(size);
+    buf = (char *) xmalloc(size);
     if (!buf)
         log_fatal("Can't claim memory for OS_GSTrans buffer!\n");
     while (_C & _swi(OS_GSTrans, _INR(0,2) | _OUT(2) | _RETURN(_FLAGS),
                      old, buf, size, &last)) {
         size += 256;
-        tmp = (char *) m_realloc(buf, size);
+        tmp = (char *) xrealloc(buf, size);
         if (!tmp)
              log_fatal("Can't claim memory for OS_GSTrans buffer!\n");
         buf = tmp;
     }
 
     buf[last] = '\0';
-    tmp = (char *) m_realloc(buf, last + 1);
+    tmp = (char *) xrealloc(buf, last + 1);
     if (!tmp)
         log_fatal("Can't realloc memory after OS_GSTrans!\n");
 
@@ -284,18 +310,21 @@ gstrans(const char *old)
 char *
 riscos_make_basename(const char *filepath, const char *realfname)
 {
-    char *p = (char*)filepath-1, *result;
+    char *result, *p;
     int i, filetype;
 
-    if ( !(p=strrchr(filepath, DIRSEP_C)) )
-        if ( !(p=strrchr(filepath, ':')) )
-            ;
+    if ( (p = strrchr(filepath, DIRSEP_C)) )
+        p++;
+    else if ( (p = strrchr(filepath, ':')) )
+        p++;
+    else
+        p = (char*) filepath;
 
-    i = strlen(p+1);
-    result = m_alloc(i + 5);
+    i = strlen(p);
+    result = xmalloc(i + 5);
     if (!result)
         log_fatal("Can't claim memory for riscos_make_basename() buffer!\n");
-    strcpy(result, p+1);
+    strcpy(result, p);
     
     filetype = riscos_get_filetype( realfname );
     result[i++] = ',';
@@ -311,9 +340,61 @@ riscos_make_basename(const char *filepath, const char *realfname)
     return result;
 }
 
+#define RegEx_CompilePattern         0x52AC0
+#define RegEx_Search                 0x52AC2
+#define RegEx_Free                   0x52AC7
+#define RegEx_CompileExtendedPattern 0x52AC9
+
+static const char * const regex_path[] = {
+    "GnuPG:RegEx",
+    "System:310.Modules.RegEx",
+    "System:Modules.RegEx",
+    NULL
+};
+
+int
+riscos_check_regexp(const char *exp, const char *string, int debug)
+{
+    static int regex_initialized = 0;
+    int ret;
+    char *buf;
+  
+    if (!regex_initialized)
+        regex_initialized = riscos_load_module("RegEx", regex_path, 0);
+  
+    if (!regex_initialized) {
+        log_info("Regular expressions cannot be used!\n");
+        return 0;
+    }
+  
+    if (_swix(RegEx_CompileExtendedPattern, _INR(0,2) | _OUT(0) | _OUT(3),
+              0, exp, 1<<18,
+              &buf, &ret)) {
+        log_info("RegEx could not compile pattern \"%s\".\n", exp);
+        log_info("ErrorCode = %i\n", ret);
+        return 0;
+    }
+  
+    if (_swix(RegEx_Search, _INR(0,4) | _OUT(5),
+              buf, string, -1, 0, -1,
+              &ret)) {
+        log_info("RegEx error during execution of serach pattern \"%s\"\n",
+                 exp);
+        log_info("on string \"%s\"\n", string);
+        return 0;
+    }
+  
+    _swix(RegEx_Free, _IN(0), buf);
+  
+    if(debug)
+        log_debug("regexp \"%s\" on \"%s\": %s\n",exp,string,ret>=0?"YES":"NO");
+  
+    return (ret>=0);
+}
+
 #ifdef DEBUG
 void
-list_openfiles(void)
+riscos_list_openfiles(void)
 {
     char *name;
     int i, len;
@@ -322,30 +403,30 @@ list_openfiles(void)
         if (_swix(OS_Args, _INR(0,2) | _IN(5) | _OUT(5), 7, i, 0, 0, &len))
             continue;
 
-        name = (char *) m_alloc(1-len);
+        name = (char *) xmalloc(1-len);
         if (!name)
             log_fatal("Can't claim memory for OS_Args buffer!\n");
 
         if (_swix(OS_Args, _INR(0,2) | _IN(5), 7, i, name, 1-len)) {
-            m_free(name);
+            xfree(name);
             log_fatal("Error when calling OS_Args(7)!\n");
         }
         
         if (_swix(OS_Args, _INR(0,1) | _OUT(0), 254, i, &len)) {
-            m_free(name);
+            xfree(name);
             log_fatal("Error when calling OS_Args(254)!\n");
         }
         
         printf("%3i: %s (%c%c)\n", i, name,
                                    (len & 0x40) ? 'R' : 0,
                                    (len & 0x80) ? 'W' : 0);
-        m_free(name);
+        xfree(name);
     }
 }
 #endif
 
 void
-not_implemented(const char *feature)
+riscos_not_implemented(const char *feature)
 {
     log_info("%s is not implemented in the RISC OS version!\n", feature);
 }