diff options
Diffstat (limited to '')
-rw-r--r-- | util/riscos.c | 436 |
1 files changed, 0 insertions, 436 deletions
diff --git a/util/riscos.c b/util/riscos.c deleted file mode 100644 index b94ff5318..000000000 --- a/util/riscos.c +++ /dev/null @@ -1,436 +0,0 @@ -/* riscos.c - RISC OS stuff - * Copyright (C) 2001 Free Software Foundation, Inc. - * - * This file is part of GnuPG for RISC OS. - * - * 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 - * (at your option) any later version. - * - * GnuPG is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA. - */ - -#ifndef __RISCOS__C__ -#define __RISCOS__C__ - -#include <config.h> -#include <stdlib.h> -#include <string.h> -#include <signal.h> -#include <fcntl.h> -#include <unistd.h> -#include <errno.h> -#include <kernel.h> -#include <swis.h> -#include "util.h" -#include "memory.h" - -#include <unixlib/local.h> /* needed for RISCOSIFY_NO_PROCESS */ -#define __UNIXLIB_INTERNALS -#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 { - int fd; - struct fds_item *next; -}; -static struct fds_item *fds_list = NULL; -static int fdlist_initialized = 0; - - -/* local RISC OS functions */ - -static int -is_read_only(const char *filename) -{ - int type, attr; - - if (_swix(OS_File, _INR(0,1) | _OUT(0) | _OUT(5), - 17, filename, &type, &attr)) - log_fatal("Can't get file attributes for file \"%s\"!\n", filename); - - if (type == 0) - log_fatal("Can't find file \"%s\"!\n", filename); - - if (_swix(OS_File, _INR(0,1) | _IN(5), 4, filename, attr)) - return 1; - - return 0; -} - -/* exported RISC OS functions */ - -int -riscos_load_module(const char *name, const char * const path[], int fatal) -{ - 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 -riscos_get_filetype_from_string(const char *string, int len) -{ - int result = 0xfff; - - if (strlen(string) < 5 || string[len - 4] != ',') - return -1; - - sscanf(string+len-3, "%3x", &result); - - return result; -} - -int -riscos_get_filetype(const char *filename) -{ - int result; - - if (_swix(OS_File, _INR(0,1) | _OUT(2), 17, filename, &result)) - log_fatal("Can't get filetype for file \"%s\"!\n", filename); - - 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" - "Is the file on a read-only file system?\n", filename); -} - -void -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); - - riscos_set_filetype_by_number(filename, result); -} - -pid_t -riscos_getpid(void) -{ - int state; - - if (_swix(Wimp_ReadSysInfo, _IN(0) | _OUT(0), 3, &state)) - log_fatal("Wimp_ReadSysInfo failed: Can't get WimpState (R0=3)!\n"); - - 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"); - - return (pid_t) state; -} - -int -riscos_kill(pid_t pid, int sig) -{ - int buf[4], iter = 0; - - if (sig) - kill(pid, sig); - - do { - if (_swix(TaskManager_EnumerateTasks, _INR(0,2) | _OUT(0), - iter, buf, 16, &iter)) - log_fatal("TaskManager_EnumerateTasks failed!\n"); - if (buf[0] == pid) - return 0; - } while (iter >= 0); - - return __set_errno(ESRCH); -} - -int -riscos_access(const char *path, int amode) -{ - /* Do additional check, i.e. whether path is on write-protected floppy */ - if ((amode & W_OK) && is_read_only(path)) - return 1; - return access(path, amode); -} - -int -riscos_getchar(void) -{ - int c, flags; - - if (_swix(OS_ReadC, _OUT(0) | _OUT(_FLAGS), &c, &flags)) - log_fatal("OS_ReadC failed: Couldn't read from keyboard!\n"); - if (flags & _C) - log_fatal("OS_ReadC failed: Return Code = %i!\n", c); - - return c; -} - -#ifdef DEBUG -void -riscos_dump_fdlist(void) -{ - struct fds_item *iter = fds_list; - printf("List of open file descriptors:\n"); - while (iter) { - printf(" %i\n", iter->fd); - iter = iter->next; - } -} -#endif /* DEBUG */ - -int -riscos_fdopenfile(const char *filename, const int allow_write) -{ - struct fds_item *h; - int fd; - if (allow_write) - fd = open(filename, O_CREAT | O_TRUNC | O_RDWR, S_IRUSR | S_IWUSR); - else - fd = open(filename, O_RDONLY); - if (fd == -1) - log_error("Can't open file \"%s\": %i, %s!\n", - filename, errno, strerror(errno)); - - if (!fdlist_initialized) { - atexit (riscos_close_fds); - fdlist_initialized = 1; - } - - h = fds_list; - 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; - fds_list->next = h; - - return fd; -} - -void -riscos_close_fds(void) -{ - FILE *fp; - struct fds_item *h = fds_list; - while( fds_list ) { - h = fds_list->next; - fp = fdopen (fds_list->fd, "a"); - if (fp) - fflush(fp); - close(fds_list->fd); - xfree(fds_list); - fds_list = h; - } -} - -int -riscos_renamefile(const char *old, const char *new) -{ - _kernel_oserror *e; - - if (e = _swix(OS_FSControl, _INR(0,2), 25, old, new)) { - if (e->errnum == 214) - return __set_errno(ENOENT); - if (e->errnum == 176) - return __set_errno(EEXIST); - printf("Error during renaming: %i, %s!\n", e->errnum, e->errmess); - return __set_errno(EOPSYS); - } - return 0; -} - -char * -riscos_gstrans(const char *old) -{ - int size = 256, last; - char *buf, *tmp; - - 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 *) xrealloc(buf, size); - if (!tmp) - log_fatal("Can't claim memory for OS_GSTrans buffer!\n"); - buf = tmp; - } - - buf[last] = '\0'; - tmp = (char *) xrealloc(buf, last + 1); - if (!tmp) - log_fatal("Can't realloc memory after OS_GSTrans!\n"); - - return tmp; -} - -/*************** - * Extract from a given path the filename component. - * (cloned from util/fileutil.c and then heavily modified) - */ -char * -riscos_make_basename(const char *filepath, const char *realfname) -{ - char *result, *p; - int i, filetype; - - if ( (p = strrchr(filepath, DIRSEP_C)) ) - p++; - else if ( (p = strrchr(filepath, ':')) ) - p++; - else - p = (char*) filepath; - - i = strlen(p); - result = xmalloc(i + 5); - if (!result) - log_fatal("Can't claim memory for riscos_make_basename() buffer!\n"); - strcpy(result, p); - - filetype = riscos_get_filetype( realfname ); - result[i++] = ','; - result[i++] = "0123456789abcdef"[(filetype >> 8) & 0xf]; - result[i++] = "0123456789abcdef"[(filetype >> 4) & 0xf]; - result[i++] = "0123456789abcdef"[(filetype >> 0) & 0xf]; - result[i] = 0; - - for(i=0; i<strlen(result); ++i) - if(result[i] == '/') - result[i] = '.'; - - 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 -riscos_list_openfiles(void) -{ - char *name; - int i, len; - - for (i = 255; i >= 0; --i) { - if (_swix(OS_Args, _INR(0,2) | _IN(5) | _OUT(5), 7, i, 0, 0, &len)) - continue; - - 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)) { - xfree(name); - log_fatal("Error when calling OS_Args(7)!\n"); - } - - if (_swix(OS_Args, _INR(0,1) | _OUT(0), 254, i, &len)) { - 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); - xfree(name); - } -} -#endif - -void -riscos_not_implemented(const char *feature) -{ - log_info("%s is not implemented in the RISC OS version!\n", feature); -} - -#endif /* !__RISCOS__C__ */ |