aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2001-08-20 11:53:05 +0000
committerWerner Koch <[email protected]>2001-08-20 11:53:05 +0000
commit23589ae0a2717df57bd7942c28a6f3c2b5a56515 (patch)
tree68aacbe45c2d1a61c058141b13a0212eff19f35d
parentAdded RSA key generation (diff)
downloadgnupg-23589ae0a2717df57bd7942c28a6f3c2b5a56515.tar.gz
gnupg-23589ae0a2717df57bd7942c28a6f3c2b5a56515.zip
Applied Stefan's patches to support RISCOS.
-rw-r--r--AUTHORS1
-rw-r--r--ChangeLog4
-rw-r--r--NEWS3
-rw-r--r--cipher/ChangeLog15
-rw-r--r--cipher/blowfish.c9
-rw-r--r--cipher/dynload.c45
-rw-r--r--cipher/md5.c4
-rw-r--r--cipher/primegen.c2
-rw-r--r--cipher/rand-internal.h1
-rw-r--r--cipher/random.c6
-rw-r--r--cipher/rmd160.c4
-rw-r--r--cipher/rndriscos.c136
-rw-r--r--cipher/rsa.c2
-rw-r--r--cipher/sha1.c4
-rw-r--r--cipher/twofish.c31
-rw-r--r--configure.ac5
-rw-r--r--doc/DETAILS5
-rw-r--r--g10/ChangeLog20
-rw-r--r--g10/compress.c20
-rw-r--r--g10/g10.c86
-rw-r--r--g10/gpgv.c10
-rw-r--r--g10/openfile.c28
-rw-r--r--g10/options.h9
-rw-r--r--g10/passphrase.c12
-rw-r--r--g10/pkclist.c2
-rw-r--r--g10/plaintext.c6
-rw-r--r--g10/ringedit.c34
-rw-r--r--g10/signal.c5
-rw-r--r--g10/tdbio.c25
-rw-r--r--g10/trustdb.c4
-rw-r--r--g10/trustdb.h2
-rw-r--r--include/ChangeLog7
-rw-r--r--include/cipher.h13
-rw-r--r--include/i18n.h4
-rw-r--r--include/iobuf.h9
-rw-r--r--include/memory.h17
-rw-r--r--include/mpi.h10
-rw-r--r--include/types.h8
-rw-r--r--include/util.h22
-rw-r--r--mpi/ChangeLog4
-rw-r--r--mpi/longlong.h4
-rw-r--r--scripts/build-riscos3
-rw-r--r--scripts/conf-riscos/cipher/construct.c38
-rw-r--r--scripts/conf-riscos/cipher/constructv.c32
-rw-r--r--scripts/conf-riscos/include/config.h380
-rw-r--r--scripts/conf-riscos/include/g10defs.h15
-rw-r--r--util/ChangeLog15
-rw-r--r--util/dotlock.c74
-rw-r--r--util/fileutil.c41
-rw-r--r--util/http.c13
-rw-r--r--util/iobuf.c10
-rw-r--r--util/logger.c36
-rw-r--r--util/memory.c21
-rw-r--r--util/riscos.c315
-rw-r--r--util/secmem.c7
-rw-r--r--util/ttyio.c64
56 files changed, 1593 insertions, 109 deletions
diff --git a/AUTHORS b/AUTHORS
index 07d45fd78..7e1c086dd 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -45,6 +45,7 @@ R�mi Guyomarch <[email protected]> Assignment
g10/free-packet.c, g10/mdfilter.c, g10/plaintext.c, util/iobuf.c)
Stefan Bellon <[email protected]> Assignment
+ (All patches to support RISCOS)
Tedi Heriyanto <[email protected]> Translations [id]
diff --git a/ChangeLog b/ChangeLog
index 54dc48ff5..6f9228cec 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2001-08-20 Werner Koch <[email protected]>
+
+ * configure.ac: Create g10defs.h with EXTSEP_S et al.
+
2001-08-03 Werner Koch <[email protected]>
* configure.ac (VERSION,PACKAGE): Fixed quoting.
diff --git a/NEWS b/NEWS
index d1fa8e24b..110e04e8e 100644
--- a/NEWS
+++ b/NEWS
@@ -21,6 +21,9 @@
* RSA key generation.
+ * Merged Stefan's patches for RISCOS in. See comments in
+ scripts/build-riscos.
+
Noteworthy changes in version 1.0.6 (2001-05-29)
------------------------------------------------
diff --git a/cipher/ChangeLog b/cipher/ChangeLog
index 2329dfe4b..c50dba0ce 100644
--- a/cipher/ChangeLog
+++ b/cipher/ChangeLog
@@ -1,3 +1,18 @@
+2001-08-20 Werner Koch <[email protected]>
+
+ Applied patches from Stefan Bellon <[email protected]> to support
+ the RISCOS. Nearly all of these patches are identified by the
+ __riscos__ macro.
+ * blowfish.c, twofish.c: Added pragmas for use with a Norcraft
+ compiler.
+ * dynload.c, md5.c, rmd160.c, sha1.c: Minor patches for RISCOS.
+ * rndriscos.c: New.
+ * rnd-internal.h: Added prototype.
+ * random.c (fast_random_poll): Use '#if defined' instead of just
+ 'defined'; needed for RISCOS.
+ * primegen.c (gen_prime): count? are now ints for consistence
+ with is_prime().
+
2001-08-08 Werner Koch <[email protected]>
* rndw32.c (gather_random): Use toolhelp in addition to the NT
diff --git a/cipher/blowfish.c b/cipher/blowfish.c
index c19d8f341..d8ad1d00d 100644
--- a/cipher/blowfish.c
+++ b/cipher/blowfish.c
@@ -502,7 +502,10 @@ selftest(void)
return NULL;
}
-
+#ifdef __riscos__
+/* need to switch off CSE optimisation for Norcroft C (Acorn/Pace) */
+#pragma no_optimise_cse
+#endif /* __riscos__ */
static int
do_bf_setkey( BLOWFISH_context *c, byte *key, unsigned keylen )
@@ -587,6 +590,10 @@ do_bf_setkey( BLOWFISH_context *c, byte *key, unsigned keylen )
return 0;
}
+#ifdef __riscos__
+#pragma optimise_cse
+#endif /* __riscos__ */
+
static int
bf_setkey( BLOWFISH_context *c, byte *key, unsigned keylen )
{
diff --git a/cipher/dynload.c b/cipher/dynload.c
index 955367f1d..09cd1366a 100644
--- a/cipher/dynload.c
+++ b/cipher/dynload.c
@@ -178,10 +178,10 @@ register_cipher_extension( const char *mainpgm, const char *fname )
if( !mainpgm_path && mainpgm && *mainpgm )
mainpgm_path = m_strdup(mainpgm);
#endif
- if( *fname != '/' ) { /* do tilde expansion etc */
+ if( *fname != DIRSEP_C ) { /* do tilde expansion etc */
char *tmp;
- if( strchr(fname, '/') )
+ if( strchr(fname, DIRSEP_C) )
tmp = make_filename(fname, NULL);
else
tmp = make_filename(GNUPG_LIBDIR, fname, NULL);
@@ -392,7 +392,13 @@ load_extension( EXTLIST el )
return -1;
}
-
+#ifdef __riscos__
+typedef
+const char *(*DIGESTS_CAST)(int, size_t*,byte**, int*, int*,
+ void (**)(void*),
+ void (**)(void*,byte*,size_t),
+ void (**)(void*),byte *(**)(void*));
+#endif /* __riscos__ */
int
enum_gnupgext_digests( void **enum_context,
@@ -435,7 +441,11 @@ enum_gnupgext_digests( void **enum_context,
if( vers != 1 || class != 10 )
continue;
inner_loop:
+#ifndef __riscos__
*r_get_info = ctx->sym;
+#else /* __riscos__ */
+ *r_get_info = (DIGESTS_CAST) ctx->sym;
+#endif /* __riscos__ */
while( (sym = (*r->enumfunc)(11, &ctx->seq2, &class, &vers)) ) {
if( vers != 1 || class != 11 )
continue;
@@ -451,6 +461,14 @@ enum_gnupgext_digests( void **enum_context,
return 0;
}
+#ifdef __riscos__
+typedef
+const char *(*CIPHERS_CAST)(int, size_t*, size_t*, size_t*,
+ int (**)( void *, byte *, unsigned),
+ void (**)( void *, byte *, byte *),
+ void (**)( void *, byte *, byte *));
+#endif /* __riscos__ */
+
const char *
enum_gnupgext_ciphers( void **enum_context, int *algo,
size_t *keylen, size_t *blocksize, size_t *contextsize,
@@ -495,7 +513,11 @@ enum_gnupgext_ciphers( void **enum_context, int *algo,
if( vers != 1 || class != 20 )
continue;
inner_loop:
+#ifndef __riscos__
finfo = ctx->sym;
+#else /* __riscos__ */
+ finfo = (CIPHERS_CAST) ctx->sym;
+#endif /* __riscos__ */
while( (sym = (*r->enumfunc)(21, &ctx->seq2, &class, &vers)) ) {
const char *algname;
if( vers != 1 || class != 21 )
@@ -516,6 +538,19 @@ enum_gnupgext_ciphers( void **enum_context, int *algo,
return NULL;
}
+#ifdef __riscos__
+typedef
+const char *(*PUBKEYS_CAST)(int, int *, int *, int *, int *, int *,
+ int (**)(int, unsigned, MPI *, MPI **),
+ int (**)(int, MPI *),
+ int (**)(int, MPI *, MPI , MPI *),
+ int (**)(int, MPI *, MPI *, MPI *),
+ int (**)(int, MPI *, MPI , MPI *),
+ int (**)(int, MPI , MPI *, MPI *,
+ int (*)(void*,MPI), void *),
+ unsigned (**)( int , MPI *));
+#endif /* __riscos__ */
+
const char *
enum_gnupgext_pubkeys( void **enum_context, int *algo,
int *npkey, int *nskey, int *nenc, int *nsig, int *use,
@@ -568,7 +603,11 @@ enum_gnupgext_pubkeys( void **enum_context, int *algo,
if( vers != 1 || class != 30 )
continue;
inner_loop:
+#ifndef __riscos__
finfo = ctx->sym;
+#else /* __riscos__ */
+ finfo = (PUBKEYS_CAST) ctx->sym;
+#endif /* __riscos__ */
while( (sym = (*r->enumfunc)(31, &ctx->seq2, &class, &vers)) ) {
const char *algname;
if( vers != 1 || class != 31 )
diff --git a/cipher/md5.c b/cipher/md5.c
index 78bf28832..6e27c7205 100644
--- a/cipher/md5.c
+++ b/cipher/md5.c
@@ -401,7 +401,11 @@ gnupgext_enum_func( int what, int *sequence, int *class, int *vers )
*vers = func_table[i].version;
switch( *class ) {
case 11: case 21: case 31: ret = &func_table[i].value; break;
+#ifndef __riscos__
default: ret = func_table[i].func; break;
+#else /* __riscos__ */
+ default: ret = (void *) func_table[i].func; break;
+#endif /* __riscos__ */
}
i++;
} while( what && what != *class );
diff --git a/cipher/primegen.c b/cipher/primegen.c
index 96048a398..f44d89d14 100644
--- a/cipher/primegen.c
+++ b/cipher/primegen.c
@@ -298,7 +298,7 @@ gen_prime( unsigned nbits, int secret, int randomlevel )
MPI prime, ptest, pminus1, val_2, val_3, result;
int i;
unsigned x, step;
- unsigned count1, count2;
+ int count1, count2;
int *mods;
if( 0 && DBG_CIPHER )
diff --git a/cipher/rand-internal.h b/cipher/rand-internal.h
index 69f96b3dc..6f5b52bae 100644
--- a/cipher/rand-internal.h
+++ b/cipher/rand-internal.h
@@ -26,5 +26,6 @@ void rndw32_constructor(void);
void rndos2_constructor(void);
void rndatari_constructor(void);
void rndmvs_constructor(void);
+void rndriscos_constructor(void);
#endif /*G10_RAND_INTERNAL_H*/
diff --git a/cipher/random.c b/cipher/random.c
index ffafd9a87..76db0d017 100644
--- a/cipher/random.c
+++ b/cipher/random.c
@@ -568,19 +568,19 @@ fast_random_poll()
}
/* fall back to the generic function */
- #if HAVE_GETHRTIME
+ #ifdef HAVE_GETHRTIME
{ hrtime_t tv;
tv = gethrtime();
add_randomness( &tv, sizeof(tv), 1 );
}
- #elif HAVE_GETTIMEOFDAY
+ #elif defined (HAVE_GETTIMEOFDAY)
{ struct timeval tv;
if( gettimeofday( &tv, NULL ) )
BUG();
add_randomness( &tv.tv_sec, sizeof(tv.tv_sec), 1 );
add_randomness( &tv.tv_usec, sizeof(tv.tv_usec), 1 );
}
- #elif HAVE_CLOCK_GETTIME
+ #elif defined (HAVE_CLOCK_GETTIME)
{ struct timespec tv;
if( clock_gettime( CLOCK_REALTIME, &tv ) == -1 )
BUG();
diff --git a/cipher/rmd160.c b/cipher/rmd160.c
index 1fd0b98f9..e35647af6 100644
--- a/cipher/rmd160.c
+++ b/cipher/rmd160.c
@@ -625,7 +625,11 @@ gnupgext_enum_func( int what, int *sequence, int *class, int *vers )
ret = &func_table[i].value;
break;
default:
+#ifndef __riscos__
ret = func_table[i].func;
+#else /* __riscos__ */
+ ret = (void *) func_table[i].func;
+#endif /* __riscos__ */
break;
}
i++;
diff --git a/cipher/rndriscos.c b/cipher/rndriscos.c
new file mode 100644
index 000000000..33cad6c0a
--- /dev/null
+++ b/cipher/rndriscos.c
@@ -0,0 +1,136 @@
+/* rndriscos.c - raw random number for RISC OS
+ * Copyright (C) 2001 Free Software Foundation, Inc.
+ *
+ * This file is part of GnuPG.
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <kernel.h>
+#include <sys/swis.h>
+#include "util.h"
+#include "dynload.h"
+
+static int init_device(void);
+static int gather_random(void (*add)(const void*, size_t, int), int requester,
+ size_t length, int level);
+
+#define CryptRandom_Byte 0x51980
+
+/****************
+ * Used to load the CryptRandom module if it isn't already loaded
+ */
+static int
+init_device(void)
+{
+ _kernel_swi_regs r;
+
+ r.r[0] = 18;
+ r.r[1] = (int) "CryptRandom";
+ if (_kernel_swi(OS_Module, &r, &r)) {
+ r.r[0] = 1;
+ r.r[1] = (int) "GnuPG:CryptRand";
+ if (_kernel_swi(OS_Module, &r, &r))
+ g10_log_fatal("Can't load module CryptRandom.\n");
+ }
+ return 1;
+}
+
+
+/****************
+ */
+static int
+gather_random(void (*add)(const void*, size_t, int), int requester,
+ size_t length, int level)
+{
+ static int initialized = 0;
+ int n;
+ byte buffer[768];
+ _kernel_swi_regs r;
+ _kernel_oserror *e;
+
+ if (!initialized)
+ initialized = init_device();
+
+ while (length) {
+ int nbytes = length < sizeof(buffer) ? length : sizeof(buffer);
+
+ for (n = 0; n < nbytes; n++) {
+ if (e = _kernel_swi(CryptRandom_Byte, &r, &r))
+ g10_log_fatal("CryptRandom module isn't working as expected!\n");
+ buffer[n] = (byte) r.r[0];
+ }
+
+ (*add)(buffer, n, requester);
+ length -= n;
+ }
+ memset(buffer, 0, sizeof(buffer));
+
+ return 0; /* success */
+}
+
+
+
+#ifndef IS_MODULE
+static
+#endif
+const char * const gnupgext_version = "RNDRISCOS ($Revision$)";
+
+static struct {
+ int class;
+ int version;
+ void *func;
+} func_table[] = {
+ { 40, 1, (void *) gather_random },
+};
+
+
+#ifndef IS_MODULE
+static
+#endif
+void *
+gnupgext_enum_func( int what, int *sequence, int *class, int *vers )
+{
+ void *ret;
+ int i = *sequence;
+
+ do {
+ if ( i >= DIM(func_table) || i < 0 ) {
+ return NULL;
+ }
+ *class = func_table[i].class;
+ *vers = func_table[i].version;
+ ret = func_table[i].func;
+ i++;
+ } while ( what && what != *class );
+
+ *sequence = i;
+ return ret;
+}
+
+#ifndef IS_MODULE
+void
+rndriscos_constructor(void)
+{
+ register_internal_cipher_extension( gnupgext_version,
+ gnupgext_enum_func );
+}
+#endif
+
diff --git a/cipher/rsa.c b/cipher/rsa.c
index e8d404732..9e6343f4f 100644
--- a/cipher/rsa.c
+++ b/cipher/rsa.c
@@ -87,7 +87,7 @@ test_keys( RSA_secret_key *sk, unsigned nbits )
/****************
* Generate a key pair with a key of size NBITS
- * Returns: 2 structures filles with all needed values
+ * Returns: 2 structures filled with all needed values
*/
static void
generate( RSA_secret_key *sk, unsigned nbits )
diff --git a/cipher/sha1.c b/cipher/sha1.c
index f5dd59d91..77749e4ee 100644
--- a/cipher/sha1.c
+++ b/cipher/sha1.c
@@ -398,7 +398,11 @@ gnupgext_enum_func( int what, int *sequence, int *class, int *vers )
ret = &func_table[i].value;
break;
default:
+#ifndef __riscos__
ret = func_table[i].func;
+#else /* __riscos__ */
+ ret = (void *) func_table[i].func;
+#endif /* __riscos__ */
break;
}
i++;
diff --git a/cipher/twofish.c b/cipher/twofish.c
index 3cd59da61..175f7c414 100644
--- a/cipher/twofish.c
+++ b/cipher/twofish.c
@@ -562,6 +562,11 @@ burn_stack (int bytes)
/* Perform the key setup. Note that this works only with 128- and 256-bit
* keys, despite the API that looks like it might support other sizes. */
+#ifdef __riscos__
+/* need to switch off CSE optimisation for Norcroft C (Acorn/Pace) */
+#pragma no_optimise_cse
+#endif /* __riscos__ */
+
static int
do_twofish_setkey (TWOFISH_context *ctx, const byte *key, unsigned int keylen)
{
@@ -697,6 +702,10 @@ do_twofish_setkey (TWOFISH_context *ctx, const byte *key, unsigned int keylen)
return 0;
}
+#ifdef __riscos__
+#pragma optimise_cse
+#endif /* __riscos__ */
+
static int
twofish_setkey (TWOFISH_context *ctx, const byte *key, unsigned int keylen)
{
@@ -767,6 +776,11 @@ twofish_setkey (TWOFISH_context *ctx, const byte *key, unsigned int keylen)
/* Encrypt one block. in and out may be the same. */
+#ifdef __riscos__
+/* need to switch off CSE optimisation for Norcroft C (Acorn/Pace) */
+#pragma no_optimise_cse
+#endif /* __riscos__ */
+
static void
do_twofish_encrypt (const TWOFISH_context *ctx, byte *out, const byte *in)
{
@@ -799,6 +813,10 @@ do_twofish_encrypt (const TWOFISH_context *ctx, byte *out, const byte *in)
OUTUNPACK (3, b, 7);
}
+#ifdef __riscos__
+#pragma optimise_cse
+#endif /* __riscos__ */
+
static void
twofish_encrypt (const TWOFISH_context *ctx, byte *out, const byte *in)
{
@@ -808,6 +826,11 @@ twofish_encrypt (const TWOFISH_context *ctx, byte *out, const byte *in)
/* Decrypt one block. in and out may be the same. */
+#ifdef __riscos__
+/* need to switch off CSE optimisation for Norcroft C (Acorn/Pace) - bug */
+#pragma no_optimise_cse
+#endif /* __riscos__ */
+
static void
do_twofish_decrypt (const TWOFISH_context *ctx, byte *out, const byte *in)
{
@@ -840,6 +863,10 @@ do_twofish_decrypt (const TWOFISH_context *ctx, byte *out, const byte *in)
OUTUNPACK (3, d, 3);
}
+#ifdef __riscos__
+#pragma optimise_cse
+#endif /* __riscos__ */
+
static void
twofish_decrypt (const TWOFISH_context *ctx, byte *out, const byte *in)
{
@@ -1093,7 +1120,11 @@ gnupgext_enum_func ( int what, int *sequence, int *class, int *vers )
ret = &func_table[i].value;
break;
default:
+#ifndef __riscos__
ret = func_table[i].func;
+#else /* __riscos__ */
+ ret = (void *) func_table[i].func;
+#endif /* __riscos__ */
break;
}
i++;
diff --git a/configure.ac b/configure.ac
index a8f90a0df..0180bfa44 100644
--- a/configure.ac
+++ b/configure.ac
@@ -766,6 +766,11 @@ cat >g10defs.tmp <<G10EOF
#define GNUPG_HOMEDIR "~/.gnupg"
#endif
#endif
+/* those are here to be redefined by handcrafted g10defs.h */
+#define DIRSEP_C '/'
+#define EXTSEP_C '.'
+#define DIRSEP_S "/"
+#define EXTSEP_S "."
G10EOF
cat mpi/mpi-asm-defs.h >>g10defs.tmp
if cmp -s g10defs.h g10defs.tmp 2>/dev/null; then
diff --git a/doc/DETAILS b/doc/DETAILS
index 0712ed597..49b7fb514 100644
--- a/doc/DETAILS
+++ b/doc/DETAILS
@@ -366,11 +366,10 @@ The format of this file is as follows:
This is a required parameter.
Key-Length: <length-in-bits>
Length of the key in bits. Default is 1024.
-
Key-Usage: <usage-list>
Space or comma delimited list of key usage, allowed values are
- "encrypt" and "sign". This is used to generate the key flags
- and must match the algorithm.
+ "encrypt" and "sign". This is used to generate the key flags.
+ Please make sure that the algorithm is capable of this usage.
Subkey-Type: <algo-number>|<algo-string>
This generates a secondary key. Currently only one subkey
can be handled.
diff --git a/g10/ChangeLog b/g10/ChangeLog
index 178e15b1c..7d583db9d 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -1,3 +1,23 @@
+2001-08-20 Werner Koch <[email protected]>
+
+ Applied patches from Stefan Bellon <[email protected]> to support
+ the RISCOS. Nearly all of these patches are identified by the
+ __riscos__ macro.
+ * compress.c: Added a couple of casts.
+ * g10.c [__riscos__]: Some patches and new options foo-file similar
+ to all foo-fd options.
+ * gpgv.c, openfile.c, ringedit.c, tdbio.c: Minor fixes. Mainly
+ replaced hardcoded path separators with EXTSEP_S like macros.
+ * passprase.c [__riscos__]: Disabled agent stuff
+ * trustdb.c (check_trust): Changed r_trustlevel to signed int to
+ avoid mismatch problems in pkclist.c
+ * pkclist.c (add_ownertrust): Ditto.
+ * plaintext.c (handle_plaintext) [__riscos__]: RPint a note when
+ file can't be created.
+ * options.h [__riscos__]: Use an extern unless included from the
+ main module.
+ * signal.c (got_fatal_signal) [__riscos__]: Close all files.
+
2001-08-14 Werner Koch <[email protected]>
* keygen.c (ask_algo): New arg r_usage. Allow for RSA keys.
diff --git a/g10/compress.c b/g10/compress.c
index a093b9efa..766fad9a5 100644
--- a/g10/compress.c
+++ b/g10/compress.c
@@ -73,7 +73,11 @@ do_compress( compress_filter_context_t *zfx, z_stream *zs, int flush, IOBUF a )
unsigned n;
do {
+#ifndef __riscos__
zs->next_out = zfx->outbuf;
+#else /* __riscos__ */
+ zs->next_out = (Bytef *) zfx->outbuf;
+#endif /* __riscos__ */
zs->avail_out = zfx->outbufsize;
if( DBG_FILTER )
log_debug("enter deflate: avail_in=%u, avail_out=%u, flush=%d\n",
@@ -143,7 +147,11 @@ do_uncompress( compress_filter_context_t *zfx, z_stream *zs,
if( zs->avail_in < zfx->inbufsize && refill ) {
n = zs->avail_in;
if( !n )
+#ifndef __riscos__
zs->next_in = zfx->inbuf;
+#else /* __riscos__ */
+ zs->next_in = (Bytef *) zfx->inbuf;
+#endif /* __riscos__ */
count = zfx->inbufsize - n;
nread = iobuf_read( a, zfx->inbuf + n, count );
if( nread == -1 ) nread = 0;
@@ -201,7 +209,11 @@ compress_filter( void *opaque, int control,
zfx->status = 1;
}
+#ifndef __riscos__
zs->next_out = buf;
+#else /* __riscos__ */
+ zs->next_out = (Bytef *) buf;
+#endif /* __riscos__ */
zs->avail_out = size;
zfx->outbufsize = size; /* needed only for calculation */
rc = do_uncompress( zfx, zs, a, ret_len );
@@ -226,7 +238,11 @@ compress_filter( void *opaque, int control,
zfx->status = 2;
}
+#ifndef __riscos__
zs->next_in = buf;
+#else /* __riscos__ */
+ zs->next_in = (Bytef *) buf;
+#endif /* __riscos__ */
zs->avail_in = size;
rc = do_compress( zfx, zs, Z_NO_FLUSH, a );
}
@@ -238,7 +254,11 @@ compress_filter( void *opaque, int control,
m_free(zfx->outbuf); zfx->outbuf = NULL;
}
else if( zfx->status == 2 ) {
+#ifndef __riscos__
zs->next_in = buf;
+#else /* __riscos__ */
+ zs->next_in = (Bytef *) buf;
+#endif /* __riscos__ */
zs->avail_in = 0;
do_compress( zfx, zs, Z_FINISH, a );
deflateEnd(zs);
diff --git a/g10/g10.c b/g10/g10.c
index 221b7a8f8..77b0c8246 100644
--- a/g10/g10.c
+++ b/g10/g10.c
@@ -28,8 +28,11 @@
#ifdef HAVE_DOSISH_SYSTEM
#include <fcntl.h> /* for setmode() */
#endif
+#ifdef __riscos__
+#include <unixlib/local.h>
+#endif /* __riscos__ */
-
+#define INCLUDED_BY_MAIN_MODULE 1
#include "packet.h"
#include "iobuf.h"
#include "memory.h"
@@ -125,6 +128,9 @@ enum cmd_and_opt_values { aNull = 0,
oDebug,
oDebugAll,
oStatusFD,
+#ifdef __riscos__
+ oStatusFile,
+#endif /* __riscos__ */
oNoComment,
oNoVersion,
oEmitVersion,
@@ -138,7 +144,13 @@ enum cmd_and_opt_values { aNull = 0,
oDigestAlgo,
oCompressAlgo,
oPasswdFD,
+#ifdef __riscos__
+ oPasswdFile,
+#endif /* __riscos__ */
oCommandFD,
+#ifdef __riscos__
+ oCommandFile,
+#endif /* __riscos__ */
oQuickRandom,
oNoVerbose,
oTrustDBName,
@@ -179,6 +191,9 @@ enum cmd_and_opt_values { aNull = 0,
oEncryptTo,
oNoEncryptTo,
oLoggerFD,
+#ifdef __riscos__
+ oLoggerFile,
+#endif /* __riscos__ */
oUtf8Strings,
oNoUtf8Strings,
oDisableCipherAlgo,
@@ -306,6 +321,9 @@ static ARGPARSE_OPTS opts[] = {
{ oDebug, "debug" ,4|16, "@"},
{ oDebugAll, "debug-all" ,0, "@"},
{ oStatusFD, "status-fd" ,1, N_("|FD|write status info to this FD") },
+#ifdef __riscos__
+ { oStatusFile, "status-file" ,2, N_("|[file]|write status info to file") },
+#endif /* __riscos__ */
{ oNoComment, "no-comment", 0, "@"},
{ oCompletesNeeded, "completes-needed", 1, "@"},
{ oMarginalsNeeded, "marginals-needed", 1, "@"},
@@ -344,7 +362,13 @@ static ARGPARSE_OPTS opts[] = {
{ aPipeMode, "pipemode", 0, "@" },
{ oKOption, NULL, 0, "@"},
{ oPasswdFD, "passphrase-fd",1, "@" },
+#ifdef __riscos__
+ { oPasswdFile, "passphrase-file",2, "@" },
+#endif /* __riscos__ */
{ oCommandFD, "command-fd",1, "@" },
+#ifdef __riscos__
+ { oCommandFile, "command-file",2, "@" },
+#endif /* __riscos__ */
{ oQuickRandom, "quick-random", 0, "@"},
{ oNoVerbose, "no-verbose", 0, "@"},
{ oTrustDBName, "trustdb-name", 2, "@" },
@@ -379,6 +403,9 @@ static ARGPARSE_OPTS opts[] = {
{ oLockMultiple, "lock-multiple", 0, "@" },
{ oLockNever, "lock-never", 0, "@" },
{ oLoggerFD, "logger-fd",1, "@" },
+#ifdef __riscos__
+ { oLoggerFile, "logger-file",2, "@" },
+#endif /* __riscos__ */
{ oUseEmbeddedFilename, "use-embedded-filename", 0, "@" },
{ oUtf8Strings, "utf8-strings", 0, "@" },
{ oNoUtf8Strings, "no-utf8-strings", 0, "@" },
@@ -454,7 +481,11 @@ strusage( int level )
break;
case 31: p = "\nHome: "; break;
+#ifndef __riscos__
case 32: p = opt.homedir; break;
+#else /* __riscos__ */
+ case 32: p = make_filename(opt.homedir, NULL); break;
+#endif /* __riscos__ */
case 33: p = _("\nSupported algorithms:\n"); break;
case 34:
if( !ciphers )
@@ -627,6 +658,11 @@ main( int argc, char **argv )
#ifdef USE_SHM_COPROCESSING
ulong requested_shm_size=0;
#endif
+ #ifdef __riscos__
+ /* set global RISC OS specific properties */
+ __riscosify_control = __RISCOSIFY_NO_PROCESS;
+ opt.lock_once = 1;
+ #endif /* __riscos__ */
trap_unaligned();
secmem_set_flags( secmem_get_flags() | 2 ); /* suspend warnings */
@@ -822,10 +858,21 @@ main( int argc, char **argv )
case oStatusFD:
set_status_fd( iobuf_translate_file_handle (pargs.r.ret_int, 1) );
break;
+#ifdef __riscos__
+ case oStatusFile:
+ set_status_fd( iobuf_translate_file_handle ( fdopenfile (pargs.r.ret_str, 1), 1) );
+ break;
+#endif /* __riscos__ */
case oLoggerFD:
log_set_logfile( NULL,
iobuf_translate_file_handle (pargs.r.ret_int, 1) );
break;
+#ifdef __riscos__
+ case oLoggerFile:
+ log_set_logfile( NULL,
+ iobuf_translate_file_handle ( fdopenfile (pargs.r.ret_str, 1), 1) );
+ break;
+#endif /* __riscos__ */
case oWithFingerprint:
with_fpr=1; /*fall thru*/
case oFingerprint: opt.fingerprint++; break;
@@ -876,8 +923,12 @@ main( int argc, char **argv )
case aListSecretKeys: set_cmd( &cmd, aListSecretKeys); break;
case oAlwaysTrust: opt.always_trust = 1; break;
case oLoadExtension:
+#ifndef __riscos__
register_cipher_extension(orig_argc? *orig_argv:NULL,
pargs.r.ret_str);
+#else /* __riscos__ */
+ not_implemented("load-extension");
+#endif /* __riscos__ */
break;
case oRFC1991:
opt.rfc1991 = 1;
@@ -906,11 +957,15 @@ main( int argc, char **argv )
case oEmuMDEncodeBug: opt.emulate_bugs |= EMUBUG_MDENCODE; break;
case oCompressSigs: opt.compress_sigs = 1; break;
case oRunAsShmCP:
+#ifndef __riscos__
#ifndef USE_SHM_COPROCESSING
/* not possible in the option file,
* but we print the warning here anyway */
log_error("shared memory coprocessing is not available\n");
#endif
+#else /* __riscos__ */
+ not_implemented("run-as-shm-coprocess");
+#endif /* __riscos__ */
break;
case oSetFilename: opt.set_filename = pargs.r.ret_str; break;
case oSetPolicyURL: opt.set_policy_url = pargs.r.ret_str; break;
@@ -941,9 +996,19 @@ main( int argc, char **argv )
case oPasswdFD:
pwfd = iobuf_translate_file_handle (pargs.r.ret_int, 0);
break;
+#ifdef __riscos__
+ case oPasswdFile:
+ pwfd = iobuf_translate_file_handle ( fdopenfile (pargs.r.ret_str, 0), 0);
+ break;
+#endif /* __riscos__ */
case oCommandFD:
opt.command_fd = iobuf_translate_file_handle (pargs.r.ret_int, 0);
break;
+#ifdef __riscos__
+ case oCommandFile:
+ opt.command_fd = iobuf_translate_file_handle ( fdopenfile (pargs.r.ret_str, 0), 0);
+ break;
+#endif /* __riscos__ */
case oCipherAlgo: def_cipher_string = m_strdup(pargs.r.ret_str); break;
case oDigestAlgo: def_digest_string = m_strdup(pargs.r.ret_str); break;
case oNoSecmemWarn: secmem_set_flags( secmem_get_flags() | 1 ); break;
@@ -956,7 +1021,13 @@ main( int argc, char **argv )
case oEscapeFrom: opt.escape_from = 1; break;
case oLockOnce: opt.lock_once = 1; break;
case oLockNever: disable_dotlock(); break;
- case oLockMultiple: opt.lock_once = 0; break;
+ case oLockMultiple:
+ opt.lock_once = 0;
+#ifdef __riscos__
+ not_implemented("lock-multiple");
+#endif
+ break;
+
case oKeyServer: opt.keyserver_name = pargs.r.ret_str; break;
case oNotation: add_notation_data( pargs.r.ret_str ); break;
case oUtf8Strings: utf8_strings = 1; break;
@@ -1098,6 +1169,13 @@ main( int argc, char **argv )
if (preference_list && keygen_set_std_prefs (preference_list))
log_error(_("invalid preferences\n"));
+#ifdef __riscos__
+ if (opt.use_agent) {
+ opt.use_agent = 0;
+ not_implemented ("use-agent");
+ }
+#endif
+
if( log_get_errorcount(0) )
g10_exit(2);
@@ -1141,11 +1219,11 @@ main( int argc, char **argv )
&& !(cmd == aKMode && argc == 2 ) ) {
if( !sec_nrings || default_keyring ) /* add default secret rings */
- add_keyblock_resource("secring.gpg", 0, 1);
+ add_keyblock_resource("secring" EXTSEP_S "gpg", 0, 1);
for(sl = sec_nrings; sl; sl = sl->next )
add_keyblock_resource( sl->d, 0, 1 );
if( !nrings || default_keyring ) /* add default ring */
- add_keyblock_resource("pubring.gpg", 0, 0);
+ add_keyblock_resource("pubring" EXTSEP_S "gpg", 0, 0);
for(sl = nrings; sl; sl = sl->next )
add_keyblock_resource( sl->d, 0, 0 );
}
diff --git a/g10/gpgv.c b/g10/gpgv.c
index c1e2bd370..64dcfe64b 100644
--- a/g10/gpgv.c
+++ b/g10/gpgv.c
@@ -28,8 +28,11 @@
#ifdef HAVE_DOSISH_SYSTEM
#include <fcntl.h> /* for setmode() */
#endif
+#ifdef __riscos__
+#include <unixlib/local.h>
+#endif /* __riscos__ */
-
+#define INCLUDED_BY_MAIN_MODULE 1
#include "packet.h"
#include "iobuf.h"
#include "memory.h"
@@ -136,6 +139,9 @@ main( int argc, char **argv )
STRLIST sl;
STRLIST nrings=NULL;
unsigned configlineno;
+ #ifdef __riscos__
+ __riscosify_control = __RISCOSIFY_NO_PROCESS;
+ #endif /* __riscos__ */
log_set_name("gpgv");
init_signals();
@@ -183,7 +189,7 @@ main( int argc, char **argv )
set_packet_list_mode(1);
if( !nrings ) /* no keyring given: use default one */
- add_keyblock_resource("trustedkeys.gpg", 0, 0);
+ add_keyblock_resource("trustedkeys" EXTSEP_S "gpg", 0, 0);
for(sl = nrings; sl; sl = sl->next )
add_keyblock_resource( sl->d, 0, 0 );
diff --git a/g10/openfile.c b/g10/openfile.c
index 2baf5a191..1bc4cf04c 100644
--- a/g10/openfile.c
+++ b/g10/openfile.c
@@ -39,10 +39,10 @@
#ifdef USE_ONLY_8DOT3
#define SKELEXT ".skl"
#else
- #define SKELEXT ".skel"
+ #define SKELEXT EXTSEP_S "skel"
#endif
-#ifdef HAVE_DRIVE_LETTERS
+#if defined (HAVE_DRIVE_LETTERS) || defined (__riscos__)
#define CMP_FILENAME(a,b) ascii_strcasecmp( (a), (b) )
#else
#define CMP_FILENAME(a,b) strcmp( (a), (b) )
@@ -102,15 +102,15 @@ make_outfile_name( const char *iname )
return m_strdup("-");
n = strlen(iname);
- if( n > 4 && ( !CMP_FILENAME(iname+n-4,".gpg")
- || !CMP_FILENAME(iname+n-4,".pgp")
- || !CMP_FILENAME(iname+n-4,".sig")
- || !CMP_FILENAME(iname+n-4,".asc") ) ) {
+ if( n > 4 && ( !CMP_FILENAME(iname+n-4, EXTSEP_S "gpg")
+ || !CMP_FILENAME(iname+n-4, EXTSEP_S "pgp")
+ || !CMP_FILENAME(iname+n-4, EXTSEP_S "sig")
+ || !CMP_FILENAME(iname+n-4, EXTSEP_S "asc") ) ) {
char *buf = m_strdup( iname );
buf[n-4] = 0;
return buf;
}
- else if( n > 5 && !CMP_FILENAME(iname+n-5,".sign") ) {
+ else if( n > 5 && !CMP_FILENAME(iname+n-5, EXTSEP_S "sign") ) {
char *buf = m_strdup( iname );
buf[n-5] = 0;
return buf;
@@ -217,8 +217,8 @@ open_outfile( const char *iname, int mode, IOBUF *a )
strcat( buf, newsfx );
#else
buf = m_alloc(strlen(iname)+4+1);
- strcpy(stpcpy(buf,iname), mode==1 ? ".asc" :
- mode==2 ? ".sig" : ".gpg");
+ strcpy(stpcpy(buf,iname), mode==1 ? EXTSEP_S "asc" :
+ mode==2 ? EXTSEP_S "sig" : EXTSEP_S "gpg");
#endif
name = buf;
}
@@ -262,9 +262,9 @@ open_sigfile( const char *iname )
if( iname && !(*iname == '-' && !iname[1]) ) {
len = strlen(iname);
- if( len > 4 && ( !strcmp(iname + len - 4, ".sig")
- || ( len > 5 && !strcmp(iname + len - 5, ".sign") )
- || !strcmp(iname + len - 4, ".asc")) ) {
+ if( len > 4 && ( !strcmp(iname + len - 4, EXTSEP_S "sig")
+ || ( len > 5 && !strcmp(iname + len - 5, EXTSEP_S "sign") )
+ || !strcmp(iname + len - 4, EXTSEP_S "asc")) ) {
char *buf;
buf = m_strdup(iname);
buf[len-(buf[len-1]=='n'?5:4)] = 0 ;
@@ -294,14 +294,14 @@ copy_options_file( const char *destdir )
return;
fname = m_alloc( strlen(datadir) + strlen(destdir) + 15 );
- strcpy(stpcpy(fname, datadir), "/options" SKELEXT );
+ strcpy(stpcpy(fname, datadir), DIRSEP_S "options" SKELEXT );
src = fopen( fname, "r" );
if( !src ) {
log_error(_("%s: can't open: %s\n"), fname, strerror(errno) );
m_free(fname);
return;
}
- strcpy(stpcpy(fname, destdir), "/options" );
+ strcpy(stpcpy(fname, destdir), DIRSEP_S "options" );
dst = fopen( fname, "w" );
if( !dst ) {
log_error(_("%s: can't create: %s\n"), fname, strerror(errno) );
diff --git a/g10/options.h b/g10/options.h
index ffd4e574c..43b547c24 100644
--- a/g10/options.h
+++ b/g10/options.h
@@ -24,7 +24,16 @@
#undef ENABLE_COMMENT_PACKETS /* don't create comment packets */
+#ifndef EXTERN_UNLESS_MAIN_MODULE
+/* Norcraft can't cope with common symbols */
+ #if defined (__riscos__) && !defined (INCLUDED_BY_MAIN_MODULE)
+ #define EXTERN_UNLESS_MAIN_MODULE extern
+ #else
+ #define EXTERN_UNLESS_MAIN_MODULE
+ #endif
+#endif
+EXTERN_UNLESS_MAIN_MODULE
struct {
int verbose;
int quiet;
diff --git a/g10/passphrase.c b/g10/passphrase.c
index a34ebbd61..c626e9adc 100644
--- a/g10/passphrase.c
+++ b/g10/passphrase.c
@@ -25,7 +25,7 @@
#include <string.h>
#include <unistd.h>
#include <assert.h>
-#ifndef HAVE_DOSISH_SYSTEM
+#if !defined(HAVE_DOSISH_SYSTEM) && !defined(__riscos__)
#include <sys/socket.h>
#include <sys/un.h>
#endif
@@ -64,7 +64,7 @@ enum gpga_protocol_codes {
GPGA_PROT_BAD_PASSPHRASE = 0x20005,
GPGA_PROT_INVALID_DATA = 0x20006,
GPGA_PROT_NOT_IMPLEMENTED= 0x20007,
- GPGA_PROT_UI_PROBLEM = 0x20008,
+ GPGA_PROT_UI_PROBLEM = 0x20008
};
@@ -153,7 +153,7 @@ read_passphrase_from_fd( int fd )
fd_passwd = pw;
}
-#ifndef HAVE_DOSISH_SYSTEM
+#if !defined(HAVE_DOSISH_SYSTEM) && !defined(__riscos__)
static int
writen ( int fd, const void *buf, size_t nbytes )
{
@@ -265,7 +265,7 @@ agent_close ( int fd )
{
close (fd);
}
-#endif /* !HAVE_DOSISH_SYSTEM */
+#endif /* !HAVE_DOSISH_SYSTEM && !__riscos__ */
/*
@@ -277,7 +277,7 @@ agent_close ( int fd )
static char *
agent_get_passphrase ( u32 *keyid, int mode )
{
- #ifdef HAVE_DOSISH_SYSTEM
+ #if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
return NULL;
#else
@@ -427,7 +427,7 @@ agent_get_passphrase ( u32 *keyid, int mode )
void
passphrase_clear_cache ( u32 *keyid, int algo )
{
- #ifdef HAVE_DOSISH_SYSTEM
+ #if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
return ;
#else
size_t n;
diff --git a/g10/pkclist.c b/g10/pkclist.c
index 8c4fa6bac..61b2c8000 100644
--- a/g10/pkclist.c
+++ b/g10/pkclist.c
@@ -418,7 +418,7 @@ add_ownertrust_cb( ulong lid )
* Returns: -1 if no ownertrust were added.
*/
static int
-add_ownertrust( PKT_public_key *pk, int *quit, unsigned *trustlevel )
+add_ownertrust( PKT_public_key *pk, int *quit, int *trustlevel )
{
int rc;
unsigned flags = 0;
diff --git a/g10/plaintext.c b/g10/plaintext.c
index f883f4a73..b559a90b2 100644
--- a/g10/plaintext.c
+++ b/g10/plaintext.c
@@ -105,8 +105,12 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
if( fp || nooutput )
;
else if( !(fp = fopen(fname,"wb")) ) {
- log_error("Error creating `%s': %s\n", fname, strerror(errno) );
+ log_error(_("error creating `%s': %s\n"), fname, strerror(errno) );
rc = G10ERR_CREATE_FILE;
+#ifdef __riscos__
+ if (errno == 106)
+ log_info("perhaps the output file has the same name as the input file?\n");
+#endif /* __riscos__ */
goto leave;
}
diff --git a/g10/ringedit.c b/g10/ringedit.c
index 4499f65f4..b2193e7e2 100644
--- a/g10/ringedit.c
+++ b/g10/ringedit.c
@@ -214,17 +214,17 @@ add_keyblock_resource( const char *url, int force, int secret )
rt = rt_GDBM;
resname += 11;
}
- #ifndef HAVE_DRIVE_LETTERS
+ #if !defined(HAVE_DRIVE_LETTERS) && !defined(__riscos__)
else if( strchr( resname, ':' ) ) {
log_error("%s: invalid URL\n", url );
rc = G10ERR_GENERAL;
goto leave;
}
- #endif
+ #endif /* !HAVE_DRIVE_LETTERS && !__riscos__ */
}
- if( *resname != '/' ) { /* do tilde expansion etc */
- if( strchr(resname, '/') )
+ if( *resname != DIRSEP_C ) { /* do tilde expansion etc */
+ if( strchr(resname, DIRSEP_C) )
filename = make_filename(resname, NULL);
else
filename = make_filename(opt.homedir, resname, NULL);
@@ -282,7 +282,7 @@ add_keyblock_resource( const char *url, int force, int secret )
if( !iobuf ) {
char *last_slash_in_filename;
- last_slash_in_filename = strrchr(filename, '/');
+ last_slash_in_filename = strrchr(filename, DIRSEP_C);
*last_slash_in_filename = 0;
if( access(filename, F_OK) ) {
@@ -292,11 +292,11 @@ add_keyblock_resource( const char *url, int force, int secret )
*/
try_make_homedir( filename );
rc = G10ERR_OPEN_FILE;
- *last_slash_in_filename = '/';
+ *last_slash_in_filename = DIRSEP_C;
goto leave;
}
- *last_slash_in_filename = '/';
+ *last_slash_in_filename = DIRSEP_C;
iobuf = iobuf_create( filename );
if( !iobuf ) {
@@ -447,8 +447,8 @@ get_writable_keyblock_file( int secret )
}
}
/* Assume the home dir is always writable */
- return make_filename(opt.homedir, secret? "secring.gpg"
- : "pubring.gpg", NULL );
+ return make_filename(opt.homedir, secret? "secring" EXTSEP_S "gpg"
+ : "pubring" EXTSEP_S "gpg", NULL );
}
@@ -1413,25 +1413,25 @@ keyring_copy( KBPOS *kbpos, int mode, KBNODE root )
* works. So we replace .gpg by .bak or .tmp
*/
if( strlen(rentry->fname) > 4
- && !strcmp(rentry->fname+strlen(rentry->fname)-4, ".gpg") ) {
+ && !strcmp(rentry->fname+strlen(rentry->fname)-4, EXTSEP_S "gpg") ) {
bakfname = m_alloc( strlen( rentry->fname ) + 1 );
strcpy(bakfname,rentry->fname);
- strcpy(bakfname+strlen(rentry->fname)-4, ".bak");
+ strcpy(bakfname+strlen(rentry->fname)-4, EXTSEP_S "bak");
tmpfname = m_alloc( strlen( rentry->fname ) + 1 );
strcpy(tmpfname,rentry->fname);
- strcpy(tmpfname+strlen(rentry->fname)-4, ".tmp");
+ strcpy(tmpfname+strlen(rentry->fname)-4, EXTSEP_S "tmp");
}
else { /* file does not end with gpg; hmmm */
bakfname = m_alloc( strlen( rentry->fname ) + 5 );
- strcpy(stpcpy(bakfname,rentry->fname),".bak");
+ strcpy(stpcpy(bakfname,rentry->fname), EXTSEP_S "bak");
tmpfname = m_alloc( strlen( rentry->fname ) + 5 );
- strcpy(stpcpy(tmpfname,rentry->fname),".tmp");
+ strcpy(stpcpy(tmpfname,rentry->fname), EXTSEP_S "tmp");
}
#else
bakfname = m_alloc( strlen( rentry->fname ) + 2 );
strcpy(stpcpy(bakfname,rentry->fname),"~");
tmpfname = m_alloc( strlen( rentry->fname ) + 5 );
- strcpy(stpcpy(tmpfname,rentry->fname),".tmp");
+ strcpy(stpcpy(tmpfname,rentry->fname), EXTSEP_S "tmp");
#endif
newfp = iobuf_create( tmpfname );
if( !newfp ) {
@@ -1534,7 +1534,7 @@ keyring_copy( KBPOS *kbpos, int mode, KBNODE root )
if( !rentry->secret ) { /* but not for secret keyrings */
iobuf_ioctl (NULL, 2, 0, bakfname );
iobuf_ioctl (NULL, 2, 0, rentry->fname );
- #ifdef HAVE_DOSISH_SYSTEM
+ #if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
remove( bakfname );
#endif
if( rename( rentry->fname, bakfname ) ) {
@@ -1546,7 +1546,7 @@ keyring_copy( KBPOS *kbpos, int mode, KBNODE root )
}
iobuf_ioctl (NULL, 2, 0, tmpfname );
iobuf_ioctl (NULL, 2, 0, rentry->fname );
- #ifdef HAVE_DOSISH_SYSTEM
+ #if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
remove( rentry->fname );
#endif
if( rename( tmpfname, rentry->fname ) ) {
diff --git a/g10/signal.c b/g10/signal.c
index 512f56368..e768e0cf3 100644
--- a/g10/signal.c
+++ b/g10/signal.c
@@ -42,7 +42,7 @@ static void
init_one_signal (int sig, RETSIGTYPE (*handler)(int), int check_ign )
{
#ifndef HAVE_DOSISH_SYSTEM
- #if HAVE_SIGACTION
+ #ifdef HAVE_SIGACTION
struct sigaction oact, nact;
if (check_ign) {
@@ -99,6 +99,9 @@ got_fatal_signal( int sig )
/* reset action to default action and raise signal again */
init_one_signal (sig, SIG_DFL, 0);
remove_lockfiles ();
+#ifdef __riscos__
+ close_fds ();
+#endif /* __riscos__ */
raise( sig );
}
diff --git a/g10/tdbio.c b/g10/tdbio.c
index e9c9457dd..de900e7ee 100644
--- a/g10/tdbio.c
+++ b/g10/tdbio.c
@@ -417,7 +417,8 @@ tdbio_set_dbname( const char *new_dbname, int create )
initialized = 1;
}
fname = new_dbname? m_strdup( new_dbname )
- : make_filename(opt.homedir, "trustdb.gpg", NULL );
+ : make_filename(opt.homedir,
+ "trustdb" EXTSEP_S "gpg", NULL );
if( access( fname, R_OK ) ) {
if( errno != ENOENT ) {
@@ -429,7 +430,7 @@ tdbio_set_dbname( const char *new_dbname, int create )
FILE *fp;
TRUSTREC rec;
int rc;
- char *p = strrchr( fname, '/' );
+ char *p = strrchr( fname, DIRSEP_C );
assert(p);
*p = 0;
@@ -437,14 +438,22 @@ tdbio_set_dbname( const char *new_dbname, int create )
try_make_homedir( fname );
log_fatal( _("%s: directory does not exist!\n"), fname );
}
- *p = '/';
+ *p = DIRSEP_C;
+ m_free(db_name);
+ db_name = fname;
+#ifdef __riscos__
+ if( !lockhandle )
+ lockhandle = create_dotlock( db_name );
+ if( !lockhandle )
+ log_fatal( _("%s: can't create lock\n"), db_name );
+ if( make_dotlock( lockhandle, -1 ) )
+ log_fatal( _("%s: can't make lock\n"), db_name );
+#endif /* __riscos__ */
fp =fopen( fname, "wb" );
if( !fp )
log_fatal( _("%s: can't create: %s\n"), fname, strerror(errno) );
fclose(fp);
- m_free(db_name);
- db_name = fname;
#ifdef HAVE_DOSISH_SYSTEM
db_fd = open( db_name, O_RDWR | O_BINARY );
#else
@@ -453,10 +462,12 @@ tdbio_set_dbname( const char *new_dbname, int create )
if( db_fd == -1 )
log_fatal( _("%s: can't open: %s\n"), db_name, strerror(errno) );
+#ifndef __riscos__
if( !lockhandle )
lockhandle = create_dotlock( db_name );
if( !lockhandle )
log_fatal( _("%s: can't create lock\n"), db_name );
+#endif /* !__riscos__ */
memset( &rec, 0, sizeof rec );
rec.r.ver.version = 2;
@@ -506,6 +517,10 @@ open_db()
lockhandle = create_dotlock( db_name );
if( !lockhandle )
log_fatal( _("%s: can't create lock\n"), db_name );
+#ifdef __riscos__
+ if( make_dotlock( lockhandle, -1 ) )
+ log_fatal( _("%s: can't make lock\n"), db_name );
+#endif /* __riscos__ */
#ifdef HAVE_DOSISH_SYSTEM
db_fd = open( db_name, O_RDWR | O_BINARY );
#else
diff --git a/g10/trustdb.c b/g10/trustdb.c
index b8a4d8b12..b9c344f50 100644
--- a/g10/trustdb.c
+++ b/g10/trustdb.c
@@ -2301,11 +2301,11 @@ query_trust_record( PKT_public_key *pk )
* is not necessary to check this if we use a local pubring. Hmmmm.
*/
int
-check_trust( PKT_public_key *pk, unsigned *r_trustlevel,
+check_trust( PKT_public_key *pk, int *r_trustlevel,
const byte *namehash, int (*add_fnc)(ulong), unsigned *retflgs )
{
TRUSTREC rec;
- unsigned trustlevel = TRUST_UNKNOWN;
+ unsigned int trustlevel = TRUST_UNKNOWN;
int rc=0;
u32 cur_time;
u32 keyid[2];
diff --git a/g10/trustdb.h b/g10/trustdb.h
index 183088723..81180a429 100644
--- a/g10/trustdb.h
+++ b/g10/trustdb.h
@@ -45,7 +45,7 @@ void update_trustdb( void );
int setup_trustdb( int level, const char *dbname );
void init_trustdb( void );
void sync_trustdb( void );
-int check_trust( PKT_public_key *pk, unsigned *r_trustlevel,
+int check_trust( PKT_public_key *pk, int *r_trustlevel,
const byte* nh, int (*add_fnc)(ulong), unsigned *retflgs );
int query_trust_info( PKT_public_key *pk, const byte *nh );
int enum_cert_paths( void **context, ulong *lid,
diff --git a/include/ChangeLog b/include/ChangeLog
index 232d4b3e2..128176c10 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,10 @@
+2001-08-20 Werner Koch <[email protected]>
+
+ * util.h [__riscos__]: Added prototypes and made sure that we
+ never use __attribute__.
+ * cipher.h, iobuf.h, memory.h, mpi.h [__riscos__]: extern hack.
+ * i18n.h [__riscos__]: Use another include file
+
2001-05-30 Werner Koch <[email protected]>
* ttyio.h (tty_printf): Add missing parenthesis for non gcc.
diff --git a/include/cipher.h b/include/cipher.h
index 8e7c26669..6863f98ec 100644
--- a/include/cipher.h
+++ b/include/cipher.h
@@ -91,10 +91,17 @@ struct gcry_md_context {
typedef struct gcry_md_context *MD_HANDLE;
+#ifndef EXTERN_UNLESS_MAIN_MODULE
+ #if defined (__riscos__) && !defined (INCLUDED_BY_MAIN_MODULE)
+ #define EXTERN_UNLESS_MAIN_MODULE extern
+ #else
+ #define EXTERN_UNLESS_MAIN_MODULE
+ #endif
+#endif
+EXTERN_UNLESS_MAIN_MODULE int g10c_debug_mode;
+EXTERN_UNLESS_MAIN_MODULE int g10_opt_verbose;
+EXTERN_UNLESS_MAIN_MODULE const char *g10_opt_homedir;
-int g10c_debug_mode;
-int g10_opt_verbose;
-const char *g10_opt_homedir;
/*-- dynload.c --*/
void register_cipher_extension( const char *mainpgm, const char *fname );
diff --git a/include/i18n.h b/include/i18n.h
index efae5f2d9..0b270687a 100644
--- a/include/i18n.h
+++ b/include/i18n.h
@@ -34,7 +34,11 @@
#endif
#ifdef ENABLE_NLS
+#ifndef __riscos__
#include <libintl.h>
+#else
+ #include "libgettext.h"
+#endif /* __riscos__ */
#define _(a) gettext (a)
#ifdef gettext_noop
#define N_(a) gettext_noop (a)
diff --git a/include/iobuf.h b/include/iobuf.h
index 595186f6e..f94cf4d28 100644
--- a/include/iobuf.h
+++ b/include/iobuf.h
@@ -71,7 +71,14 @@ struct iobuf_struct {
} unget;
};
-int iobuf_debug_mode;
+#ifndef EXTERN_UNLESS_MAIN_MODULE
+ #if defined (__riscos__) && !defined (INCLUDED_BY_MAIN_MODULE)
+ #define EXTERN_UNLESS_MAIN_MODULE extern
+ #else
+ #define EXTERN_UNLESS_MAIN_MODULE
+ #endif
+#endif
+EXTERN_UNLESS_MAIN_MODULE int iobuf_debug_mode;
void iobuf_enable_special_filenames ( int yes );
IOBUF iobuf_alloc(int use, size_t bufsize);
diff --git a/include/memory.h b/include/memory.h
index 76acd8732..5a405d18b 100644
--- a/include/memory.h
+++ b/include/memory.h
@@ -25,7 +25,11 @@
#ifndef STR
#define STR(v) #v
#endif
-#define M_DBGINFO(a) __FUNCTION__ "["__FILE__ ":" STR(a) "]"
+#ifndef __riscos__
+ #define M_DBGINFO(a) __FUNCTION__ "["__FILE__ ":" STR(a) "]"
+#else /* __riscos__ */
+ #define M_DBGINFO(a) "["__FILE__ ":" STR(a) "]"
+#endif /* __riscos__ */
#define m_alloc(n) m_debug_alloc((n), M_DBGINFO( __LINE__ ) )
#define m_alloc_clear(n) m_debug_alloc_clear((n), M_DBGINFO(__LINE__) )
#define m_alloc_secure(n) m_debug_alloc((n), M_DBGINFO(__LINE__) )
@@ -76,9 +80,16 @@ unsigned secmem_get_flags(void);
#define DBG_MEMORY memory_debug_mode
#define DBG_MEMSTAT memory_stat_debug_mode
-int memory_debug_mode;
-int memory_stat_debug_mode;
+#ifndef EXTERN_UNLESS_MAIN_MODULE
+ #if defined (__riscos__) && !defined (INCLUDED_BY_MAIN_MODULE)
+ #define EXTERN_UNLESS_MAIN_MODULE extern
+ #else
+ #define EXTERN_UNLESS_MAIN_MODULE
+ #endif
+#endif
+EXTERN_UNLESS_MAIN_MODULE int memory_debug_mode;
+EXTERN_UNLESS_MAIN_MODULE int memory_stat_debug_mode;
#endif /*G10_MEMORY_H*/
diff --git a/include/mpi.h b/include/mpi.h
index 27723d1b7..99bd6a883 100644
--- a/include/mpi.h
+++ b/include/mpi.h
@@ -53,9 +53,17 @@
#endif
#define BITS_PER_MPI_LIMB (8*BYTES_PER_MPI_LIMB)
+#ifndef EXTERN_UNLESS_MAIN_MODULE
+ #if defined (__riscos__) && !defined (INCLUDED_BY_MAIN_MODULE)
+ #define EXTERN_UNLESS_MAIN_MODULE extern
+ #else
+ #define EXTERN_UNLESS_MAIN_MODULE
+ #endif
+#endif
#define DBG_MPI mpi_debug_mode
-int mpi_debug_mode;
+EXTERN_UNLESS_MAIN_MODULE int mpi_debug_mode;
+
struct gcry_mpi {
int alloced; /* array size (# of allocated limbs) */
diff --git a/include/types.h b/include/types.h
index dbd711c94..81696aeea 100644
--- a/include/types.h
+++ b/include/types.h
@@ -43,7 +43,13 @@
#ifndef HAVE_BYTE_TYPEDEF
#undef byte /* maybe there is a macro with this name */
- typedef unsigned char byte;
+ #ifndef __riscos__
+ typedef unsigned char byte;
+ #else
+ /* FIXME it seems that char is unsigned by default and we workaround
+ * signed/unsigned mismacthes here. */
+ typedef char byte;
+ #endif
#define HAVE_BYTE_TYPEDEF
#endif
diff --git a/include/util.h b/include/util.h
index 527961336..aa2d90594 100644
--- a/include/util.h
+++ b/include/util.h
@@ -68,7 +68,8 @@ int log_get_errorcount( int clear );
void log_inc_errorcount(void);
void g10_log_hexdump( const char *text, const char *buf, size_t len );
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 )
+#if !defined (__riscos__) \
+ && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 ))
void g10_log_bug( const char *fmt, ... )
__attribute__ ((noreturn, format (printf,1,2)));
void g10_log_bug0( const char *, int, const char * ) __attribute__ ((noreturn));
@@ -240,4 +241,23 @@ int vasprintf ( char **result, const char *format, va_list args);
#define DIM(v) (sizeof(v)/sizeof((v)[0]))
#define DIMof(type,member) DIM(((type *)0)->member)
+/******* RISC OS stuff ***********/
+#ifdef __riscos__
+FILE *riscos_fopen(const char *filename, const char *mode);
+int riscos_open(const char *filename, int oflag, ...);
+int riscos_fstat(int fildes, struct stat *buf);
+int fdopenfile(const char *filename, const int allow_write);
+void close_fds(void);
+int renamefile(const char *old, const char *new);
+char *gstrans(const char *old);
+void not_implemented(const char *feature);
+void set_filetype(const char *filename, const int type);
+#ifndef __RISCOS__C__
+ #define fopen riscos_fopen
+ #define open riscos_open
+ #define fstat riscos_fstat
+#endif /* !__RISCOS__C__ */
+#endif /* __riscos__ */
+
#endif /*G10_UTIL_H*/
+
diff --git a/mpi/ChangeLog b/mpi/ChangeLog
index 9a60c3727..713b82df8 100644
--- a/mpi/ChangeLog
+++ b/mpi/ChangeLog
@@ -1,3 +1,7 @@
+2001-08-20 Werner Koch <[email protected]>
+
+ * longlong.h [__riscos__]: Need a special pragma here.
+
2001-08-09 Werner Koch <[email protected]>
* config.links: Added configuraton for powerpc-openbsd. By Peter
diff --git a/mpi/longlong.h b/mpi/longlong.h
index 84020773d..6cfb8c8ce 100644
--- a/mpi/longlong.h
+++ b/mpi/longlong.h
@@ -94,6 +94,9 @@ MA 02111-1307, USA. */
Please add support for more CPUs here, or improve the current support
for the CPUs below! */
+#ifdef __riscos__
+#pragma continue_after_hash_error
+#else /* !__riscos__ */
#if defined (__GNUC__) && !defined (NO_ASM)
/* We sometimes need to clobber "cc" with gcc2, but that would not be
@@ -1312,6 +1315,7 @@ extern USItype __udiv_qrnnd ();
#endif /* __z8000__ */
#endif /* __GNUC__ */
+#endif /* !__riscos__ */
/***************************************
diff --git a/scripts/build-riscos b/scripts/build-riscos
new file mode 100644
index 000000000..557660cf5
--- /dev/null
+++ b/scripts/build-riscos
@@ -0,0 +1,3 @@
+Please add here the stuff to build the riscos version. The script
+should copy the files ffrom the conf-riscos tree over the main tree.
+It would be nice to make sure that it can only be used under riscos.
diff --git a/scripts/conf-riscos/cipher/construct.c b/scripts/conf-riscos/cipher/construct.c
new file mode 100644
index 000000000..122d740e8
--- /dev/null
+++ b/scripts/conf-riscos/cipher/construct.c
@@ -0,0 +1,38 @@
+/* construct.c - RISC OS constructors for cipher algorithms
+ * Copyright (C) 2001 Free Software Foundation, Inc.
+ *
+ * This file is part of GnuPG.
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+void rndriscos_constructor(void);
+void sha1_constructor(void);
+void rmd160_constructor(void);
+void md5_constructor(void);
+
+void
+cipher_modules_constructor(void)
+{
+ static int done = 0;
+ if( done )
+ return;
+ done = 1;
+
+ rndriscos_constructor();
+ sha1_constructor();
+ rmd160_constructor();
+ md5_constructor();
+}
diff --git a/scripts/conf-riscos/cipher/constructv.c b/scripts/conf-riscos/cipher/constructv.c
new file mode 100644
index 000000000..cb50bfff8
--- /dev/null
+++ b/scripts/conf-riscos/cipher/constructv.c
@@ -0,0 +1,32 @@
+/* constructv.c - RISC OS constructors for cipher algorithms (gpgv version)
+ * Copyright (C) 2001 Free Software Foundation, Inc.
+ *
+ * This file is part of GnuPG.
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+void rmd160_constructor(void);
+
+void
+cipher_modules_constructor(void)
+{
+ static int done = 0;
+ if( done )
+ return;
+ done = 1;
+
+ rmd160_constructor();
+}
diff --git a/scripts/conf-riscos/include/config.h b/scripts/conf-riscos/include/config.h
new file mode 100644
index 000000000..4a8d68502
--- /dev/null
+++ b/scripts/conf-riscos/include/config.h
@@ -0,0 +1,380 @@
+/* config.h - hand edited by Stefan Bellon to suit RISC OS needs
+ * Copyright (C) 2001 Free Software Foundation, Inc.
+ *
+ * This file is part of GNUPG.
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+#ifndef G10_CONFIG_H
+#define G10_CONFIG_H
+
+/* need this, because some autoconf tests rely on this (e.g. stpcpy)
+ * and it should be used for new programs
+ */
+#define _GNU_SOURCE 1
+
+
+/* Define if using alloca.c. */
+#undef C_ALLOCA
+
+/* Define to empty if the keyword does not work. */
+#undef const
+
+/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
+ This function is required for alloca.c support on those systems. */
+#undef CRAY_STACKSEG_END
+
+/* Define if you have alloca, as a function or macro. */
+/* #undef HAVE_ALLOCA */
+#define HAVE_ALLOCA
+
+/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
+/* #undef HAVE_ALLOCA_H */
+#define HAVE_ALLOCA_H
+
+/* #undef _LIBC */
+
+/* Define if you don't have vprintf but do have _doprnt. */
+#undef HAVE_DOPRNT
+
+/* Define if you have the vprintf function. */
+#define HAVE_VPRINTF
+
+/* Define as __inline if that's what the C compiler calls it. */
+#define inline __inline
+
+/* Define to `long' if <sys/types.h> doesn't define. */
+#undef off_t
+
+/* Define if you need to in order for stat and other things to work. */
+#undef _POSIX_SOURCE
+
+/* Define as the return type of signal handlers (int or void). */
+#define RETSIGTYPE void
+
+/* Define to `unsigned' if <sys/types.h> doesn't define. */
+#define size_t unsigned int
+
+/* If using the C implementation of alloca, define if you know the
+ direction of stack growth for your system; otherwise it will be
+ automatically deduced at run-time.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown
+ */
+#undef STACK_DIRECTION
+
+/* Define if you have the ANSI C header files. */
+#define STDC_HEADERS
+
+/* Define if `sys_siglist' is declared by <signal.h>. */
+#define SYS_SIGLIST_DECLARED
+
+#undef M_DEBUG
+#undef M_GUARD
+#define PRINTABLE_OS_NAME "RISC OS"
+
+/* Define if your locale.h file contains LC_MESSAGES. */
+#undef HAVE_LC_MESSAGES
+
+/* Define to 1 if NLS is requested. */
+#define ENABLE_NLS 1
+
+/* Define as 1 if you have catgets and don't want to use GNU gettext. */
+#undef HAVE_CATGETS
+
+/* Define as 1 if you have gettext and don't want to use GNU gettext. */
+#undef HAVE_GETTEXT
+
+#undef BIG_ENDIAN_HOST
+#define LITTLE_ENDIAN_HOST
+
+#undef HAVE_BYTE_TYPEDEF
+#undef HAVE_USHORT_TYPEDEF
+#undef HAVE_ULONG_TYPEDEF
+#undef HAVE_U16_TYPEDEF
+#undef HAVE_U32_TYPEDEF
+
+#undef HAVE_BROKEN_MLOCK
+
+/* defined if we have a /dev/random and /dev/urandom */
+#undef HAVE_DEV_RANDOM
+/* and the real names of the random devices */
+#undef NAME_OF_DEV_RANDOM
+#undef NAME_OF_DEV_URANDOM
+/* Linux has an ioctl */
+#undef HAVE_DEV_RANDOM_IOCTL
+
+/* see cipher/rndegd.c */
+#undef EGD_SOCKET_NAME
+
+#undef USE_DYNAMIC_LINKING
+#undef HAVE_DL_DLOPEN
+#undef HAVE_DL_SHL_LOAD
+#undef HAVE_DLD_DLD_LINK
+
+#undef USE_SHM_COPROCESSING
+
+#undef IPC_HAVE_SHM_LOCK
+#undef IPC_RMID_DEFERRED_RELEASE
+
+/* set this to limit filenames to the 8.3 format */
+#undef USE_ONLY_8DOT3
+/* defined if we must run on a stupid file system */
+#undef HAVE_DRIVE_LETTERS
+/* defined if we run on some of the PCDOS like systems (DOS, Windoze. OS/2)
+ * with special properties like no file modes */
+#undef HAVE_DOSISH_SYSTEM
+/* because the Unix gettext has to much overhead on MingW32 systems
+ * and these systems lack Posix functions, we use a simplified version
+ * of gettext */
+#undef USE_SIMPLE_GETTEXT
+/* At some point in the system we need to know that we use the Windows
+ * random module. */
+#undef USE_STATIC_RNDW32
+
+#undef USE_CAPABILITIES
+
+/* Some systems have mkdir that takes a single argument. */
+#undef MKDIR_TAKES_ONE_ARG
+
+/* The number of bytes in a unsigned int. */
+#define SIZEOF_UNSIGNED_INT 4
+
+/* The number of bytes in a unsigned long. */
+#define SIZEOF_UNSIGNED_LONG 4
+
+/* The number of bytes in a unsigned long long. */
+#define SIZEOF_UNSIGNED_LONG_LONG 0
+
+/* The number of bytes in a unsigned short. */
+#define SIZEOF_UNSIGNED_SHORT 2
+
+/* Define if you have the __argz_count function. */
+#undef HAVE___ARGZ_COUNT
+
+/* Define if you have the __argz_next function. */
+#undef HAVE___ARGZ_NEXT
+
+/* Define if you have the __argz_stringify function. */
+#undef HAVE___ARGZ_STRINGIFY
+
+/* Define if you have the atexit function. */
+#define HAVE_ATEXIT
+
+/* Define if you have the clock_gettime function. */
+#undef HAVE_CLOCK_GETTIME
+
+/* Define if you have the dcgettext function. */
+#undef HAVE_DCGETTEXT
+
+/* Define if you have the dlopen function. */
+#undef HAVE_DLOPEN
+
+/* Define if you have the fopen64 function. */
+#undef HAVE_FOPEN64
+
+/* Define if you have the fstat64 function. */
+#undef HAVE_FSTAT64
+
+/* Define if you have the getcwd function. */
+#define HAVE_GETCWD
+
+/* Define if you have the gethrtime function. */
+#undef HAVE_GETHRTIME
+
+/* Define if you have the getpagesize function. */
+#define HAVE_GETPAGESIZE
+
+/* Define if you have the getrusage function. */
+#define HAVE_GETRUSAGE
+
+/* Define if you have the gettimeofday function. */
+#define HAVE_GETTIMEOFDAY
+
+/* Define if you have the memicmp function. */
+#undef HAVE_MEMICMP
+
+/* Define if you have the memmove function. */
+#define HAVE_MEMMOVE
+
+/* Define if you have the mlock function. */
+#undef HAVE_MLOCK
+
+/* Define if you have the mmap function. */
+#undef HAVE_MMAP
+
+/* Define if you have the munmap function. */
+#undef HAVE_MUNMAP
+
+/* Define if you have the nl_langinfo function. */
+#undef HAVE_NL_LANGINFO
+
+/* Define if you have the putenv function. */
+#define HAVE_PUTENV
+
+/* Define if you have the raise function. */
+#define HAVE_RAISE
+
+/* Define if you have the rand function. */
+#define HAVE_RAND
+
+/* Define if you have the setenv function. */
+#define HAVE_SETENV
+
+/* Define if you have the setlocale function. */
+#define HAVE_SETLOCALE
+
+/* Define if you have the setrlimit function. */
+#define HAVE_SETRLIMIT
+
+/* Define if you have the sigaction function. */
+#define HAVE_SIGACTION
+
+/* Define if you have the sigprocmask function. */
+#define HAVE_SIGPROCMASK
+
+/* Define if you have the stpcpy function. */
+#define HAVE_STPCPY
+
+/* Define if you have the strcasecmp function. */
+#define HAVE_STRCASECMP
+
+/* Define if you have the strchr function. */
+#define HAVE_STRCHR
+
+/* Define if you have the strdup function. */
+#define HAVE_STRDUP
+
+/* Define if you have the strerror function. */
+#define HAVE_STRERROR
+
+/* Define if you have the strftime function. */
+#define HAVE_STRFTIME
+
+/* Define if you have the stricmp function. */
+#define HAVE_STRICMP
+
+/* Define if you have the strlwr function. */
+#undef HAVE_STRLWR
+
+/* Define if you have the strtoul function. */
+#define HAVE_STRTOUL
+
+/* Define if you have the tcgetattr function. */
+#define HAVE_TCGETATTR
+
+/* Define if you have the wait4 function. */
+#define HAVE_WAIT4
+
+/* Define if you have the waitpid function. */
+#define HAVE_WAITPID
+
+/* Define if you have the <argz.h> header file. */
+#undef HAVE_ARGZ_H
+
+/* Define if you have the <direct.h> header file. */
+#undef HAVE_DIRECT_H
+
+/* Define if you have the <gdbm.h> header file. */
+#undef HAVE_GDBM_H
+
+/* Define if you have the <langinfo.h> header file. */
+#undef HAVE_LANGINFO_H
+
+/* Define if you have the <limits.h> header file. */
+#define HAVE_LIMITS_H
+
+/* Define if you have the <linux/random.h> header file. */
+#undef HAVE_LINUX_RANDOM_H
+
+/* Define if you have the <locale.h> header file. */
+#define HAVE_LOCALE_H
+
+/* Define if you have the <malloc.h> header file. */
+#define HAVE_MALLOC_H
+
+/* Define if you have the <nl_types.h> header file. */
+#undef HAVE_NL_TYPES_H
+
+/* Define if you have the <string.h> header file. */
+#define HAVE_STRING_H
+
+/* Define if you have the <sys/capability.h> header file. */
+#undef HAVE_SYS_CAPABILITY_H
+
+/* Define if you have the <sys/ipc.h> header file. */
+#undef HAVE_SYS_IPC_H
+
+/* Define if you have the <sys/mman.h> header file. */
+#define HAVE_SYS_MMAN_H
+
+/* Define if you have the <sys/param.h> header file. */
+#define HAVE_SYS_PARAM_H
+
+/* Define if you have the <sys/shm.h> header file. */
+#undef HAVE_SYS_SHM_H
+
+/* Define if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H
+
+/* Define if you have the <termio.h> header file. */
+#define HAVE_TERMIO_H
+
+/* Define if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H
+
+/* Define if you have the <zlib.h> header file. */
+#define HAVE_ZLIB_H
+
+/* Define if you have the dl library (-ldl). */
+#undef HAVE_LIBDL
+
+/* Define if you have the dld library (-ldld). */
+#undef HAVE_LIBDLD
+
+/* Define if you have the gdbm library (-lgdbm). */
+#undef HAVE_LIBGDBM
+
+/* Define if you have the i library (-li). */
+#undef HAVE_LIBI
+
+/* Define if you have the nsl library (-lnsl). */
+#undef HAVE_LIBNSL
+
+/* Define if you have the rt library (-lrt). */
+#undef HAVE_LIBRT
+
+/* Name of package */
+#define PACKAGE "GnuPG"
+
+/* Version number of package */
+/* no more needed here as set in the Makefile
+#define VERSION "1.0.4"
+#define IS_DEVELOPMENT_VERSION
+*/
+
+/* define if compiled symbols have a leading underscore */
+#define WITH_SYMBOL_UNDERSCORE
+
+#define getpid riscos_getpid
+#define kill(pid, sig) riscos_kill(pid, sig)
+#ifdef IS_DEVELOPMENT_VERSION
+ #define M_GUARD
+#endif
+
+#include "g10defs.h"
+
+#endif /*G10_CONFIG_H*/
diff --git a/scripts/conf-riscos/include/g10defs.h b/scripts/conf-riscos/include/g10defs.h
new file mode 100644
index 000000000..6e15f2d93
--- /dev/null
+++ b/scripts/conf-riscos/include/g10defs.h
@@ -0,0 +1,15 @@
+
+ #define G10_LOCALEDIR "<GnuPG$Dir>.locale"
+ #define GNUPG_LIBDIR "<GnuPG$Dir>"
+ #define GNUPG_DATADIR "<GnuPG$Dir>"
+ #define GNUPG_HOMEDIR "<GnuPGUser$Dir>"
+ #define LOCALE_ALIAS_PATH "<GnuPG$Dir>.locale"
+ #define GNULOCALEDIR "<GnuPG$Dir>.locale"
+ #define DIRSEP_C '.'
+ #define EXTSEP_C '/'
+ #define DIRSEP_S "."
+ #define EXTSEP_S "/"
+/* This file defines some basic constants for the MPI machinery. We
+ * need to define the types on a per-CPU basis, so it is done with
+ * this file here. */
+#define BYTES_PER_MPI_LIMB (SIZEOF_UNSIGNED_LONG)
diff --git a/util/ChangeLog b/util/ChangeLog
index 92d6cecb7..3e361bcdb 100644
--- a/util/ChangeLog
+++ b/util/ChangeLog
@@ -1,3 +1,18 @@
+2001-08-20 Werner Koch <[email protected]>
+
+ Applied patches from Stefan Bellon <[email protected]> to support
+ the RISCOS. Nearly all of these patches are identified by the
+ __riscos__ macro.
+ * secmem.c [__riscos__]: Disabled secure memory stuff.
+ * dotlock.c, ttyio.c [__riscos__]: Adapted for RISCOS
+ * fileutil.c, iobuf.c: Adapted for RISCOS; mainly replaced
+ hardcoded path separators with EXTSEP_S like macros.
+ * http.c (send_request): Use macros for the env-var name.
+ * logger.c [__riscos__]: Do an fflush at the end of each log
+ function.
+ * memory.c [__riscos__]: Minor patches
+ * riscos.c (set_filetype): New.
+
2001-07-03 Werner Koch <[email protected]>
* strgutil.c (utf8_to_native): Fixed printing of invalid utf-8
diff --git a/util/dotlock.c b/util/dotlock.c
index 6b65e62b2..fac825450 100644
--- a/util/dotlock.c
+++ b/util/dotlock.c
@@ -1,5 +1,5 @@
/* dotlock.c - dotfile locking
- * Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
*
* This file is part of GnuPG.
*
@@ -25,7 +25,7 @@
#include <ctype.h>
#include <errno.h>
#include <unistd.h>
-#ifndef HAVE_DOSISH_SYSTEM
+#if !defined (HAVE_DOSISH_SYSTEM)
#include <sys/utsname.h>
#endif
#include <sys/types.h>
@@ -80,7 +80,7 @@ create_dotlock( const char *file_to_lock )
DOTLOCK h;
int fd = -1;
char pidstr[16];
- #ifndef HAVE_DOSISH_SYSTEM
+ #if !defined (HAVE_DOSISH_SYSTEM)
struct utsname utsbuf;
#endif
const char *nodename;
@@ -106,7 +106,7 @@ create_dotlock( const char *file_to_lock )
}
-#ifndef HAVE_DOSISH_SYSTEM
+#if !defined (HAVE_DOSISH_SYSTEM)
sprintf( pidstr, "%10d\n", (int)getpid() );
/* fixme: add the hostname to the second line (FQDN or IP addr?) */
@@ -116,8 +116,17 @@ create_dotlock( const char *file_to_lock )
else
nodename = utsbuf.nodename;
- if( !(dirpart = strrchr( file_to_lock, '/' )) ) {
- dirpart = ".";
+#ifdef __riscos__
+ {
+ char *iter = (char *) nodename;
+ for (; iter[0]; iter++)
+ if (iter[0] == '.')
+ iter[0] = '/';
+ }
+#endif /* __riscos__ */
+
+ if( !(dirpart = strrchr( file_to_lock, DIRSEP_C )) ) {
+ dirpart = EXTSEP_S;
dirpartlen = 1;
}
else {
@@ -132,8 +141,13 @@ create_dotlock( const char *file_to_lock )
all_lockfiles = h;
h->tname = m_alloc( dirpartlen + 6+30+ strlen(nodename) + 11 );
+#ifndef __riscos__
sprintf( h->tname, "%.*s/.#lk%p.%s.%d",
dirpartlen, dirpart, h, nodename, (int)getpid() );
+#else /* __riscos__ */
+ sprintf( h->tname, "%.*s.lk%p/%s/%d",
+ dirpartlen, dirpart, h, nodename, (int)getpid() );
+#endif /* __riscos__ */
do {
errno = 0;
@@ -175,9 +189,9 @@ create_dotlock( const char *file_to_lock )
#ifdef _REENTRANT
/* release mutex */
#endif
-#endif /* !HAVE_DOSISH_SYSTEM */
+#endif
h->lockname = m_alloc( strlen(file_to_lock) + 6 );
- strcpy(stpcpy(h->lockname, file_to_lock), ".lock");
+ strcpy(stpcpy(h->lockname, file_to_lock), EXTSEP_S "lock");
return h;
}
@@ -202,7 +216,7 @@ maybe_deadlock( DOTLOCK h )
int
make_dotlock( DOTLOCK h, long timeout )
{
-#ifdef HAVE_DOSISH_SYSTEM
+#if defined (HAVE_DOSISH_SYSTEM)
return 0;
#else
int pid;
@@ -214,11 +228,14 @@ make_dotlock( DOTLOCK h, long timeout )
}
if( h->locked ) {
+#ifndef __riscos__
log_debug("oops, `%s' is already locked\n", h->lockname );
+#endif /* !__riscos__ */
return 0;
}
for(;;) {
+#ifndef __riscos__
if( !link(h->tname, h->lockname) ) {
/* fixme: better use stat to check the link count */
h->locked = 1;
@@ -228,6 +245,16 @@ make_dotlock( DOTLOCK h, long timeout )
log_error( "lock not made: link() failed: %s\n", strerror(errno) );
return -1;
}
+#else /* __riscos__ */
+ if( !renamefile(h->tname, h->lockname) ) {
+ h->locked = 1;
+ return 0; /* okay */
+ }
+ if( errno != EEXIST ) {
+ log_error( "lock not made: rename() failed: %s\n", strerror(errno) );
+ return -1;
+ }
+#endif /* __riscos__ */
if( (pid = read_lockfile(h->lockname)) == -1 ) {
if( errno != ENOENT ) {
log_info("cannot read lockfile\n");
@@ -242,11 +269,18 @@ make_dotlock( DOTLOCK h, long timeout )
return 0; /* okay */
}
else if( kill(pid, 0) && errno == ESRCH ) {
+#ifndef __riscos__
maybe_dead = " - probably dead";
#if 0 /* we should not do this without checking the permissions */
/* and the hostname */
log_info( "removing stale lockfile (created by %d)", pid );
#endif
+#else /* __riscos__ */
+ /* we are *pretty* sure that the other task is dead and therefore
+ we remove the other lock file */
+ maybe_dead = " - probably dead - removing lock";
+ unlink(h->lockname);
+#endif /* __riscos__ */
}
if( timeout == -1 ) {
struct timeval tv;
@@ -265,7 +299,7 @@ make_dotlock( DOTLOCK h, long timeout )
return -1;
}
/*not reached */
-#endif /* !HAVE_DOSISH_SYSTEM */
+#endif
}
@@ -276,7 +310,7 @@ make_dotlock( DOTLOCK h, long timeout )
int
release_dotlock( DOTLOCK h )
{
-#ifdef HAVE_DOSISH_SYSTEM
+#if defined (HAVE_DOSISH_SYSTEM)
return 0;
#else
int pid;
@@ -299,15 +333,23 @@ release_dotlock( DOTLOCK h )
log_error( "release_dotlock: not our lock (pid=%d)\n", pid);
return -1;
}
+#ifndef __riscos__
if( unlink( h->lockname ) ) {
log_error( "release_dotlock: error removing lockfile `%s'",
h->lockname);
return -1;
}
+#else /* __riscos__ */
+ if( renamefile(h->lockname, h->tname) ) {
+ log_error( "release_dotlock: error renaming lockfile `%s' to `%s'",
+ h->lockname, h->tname);
+ return -1;
+ }
+#endif /* __riscos__ */
/* fixme: check that the link count is now 1 */
h->locked = 0;
return 0;
-#endif /* !HAVE_DOSISH_SYSTEM */
+#endif
}
@@ -317,7 +359,7 @@ release_dotlock( DOTLOCK h )
static int
read_lockfile( const char *name )
{
- #ifdef HAVE_DOSISH_SYSTEM
+ #if defined (HAVE_DOSISH_SYSTEM)
return 0;
#else
int fd, pid;
@@ -338,7 +380,11 @@ read_lockfile( const char *name )
pidstr[10] = 0; /* terminate pid string */
close(fd);
pid = atoi(pidstr);
+#ifndef __riscos__
if( !pid || pid == -1 ) {
+#else /* __riscos__ */
+ if( (!pid && riscos_getpid()) || pid == -1 ) {
+#endif /* __riscos__ */
log_error("invalid pid %d in lockfile `%s'", pid, name );
errno = 0;
return -1;
@@ -351,7 +397,7 @@ read_lockfile( const char *name )
void
remove_lockfiles()
{
- #ifndef HAVE_DOSISH_SYSTEM
+ #if !defined (HAVE_DOSISH_SYSTEM)
DOTLOCK h, h2;
h = all_lockfiles;
diff --git a/util/fileutil.c b/util/fileutil.c
index 1e8ad75ad..30c2511b6 100644
--- a/util/fileutil.c
+++ b/util/fileutil.c
@@ -25,6 +25,10 @@
#include <string.h>
#include <assert.h>
#include <unistd.h>
+#ifdef __riscos__
+#include <kernel.h>
+#include <sys/swis.h>
+#endif /* __riscos__ */
#include "util.h"
#include "memory.h"
#include "ttyio.h"
@@ -39,7 +43,7 @@ make_basename(const char *filepath)
{
char *p;
- if ( !(p=strrchr(filepath, '/')) )
+ if ( !(p=strrchr(filepath, DIRSEP_C)) )
#ifdef HAVE_DRIVE_LETTERS
if ( !(p=strrchr(filepath, '\\')) )
if ( !(p=strrchr(filepath, ':')) )
@@ -66,13 +70,13 @@ make_dirname(const char *filepath)
int dirname_length;
char *p;
- if ( !(p=strrchr(filepath, '/')) )
+ if ( !(p=strrchr(filepath, DIRSEP_C)) )
#ifdef HAVE_DRIVE_LETTERS
if ( !(p=strrchr(filepath, '\\')) )
if ( !(p=strrchr(filepath, ':')) )
#endif
{
- return m_strdup(".");
+ return m_strdup(EXTSEP_S);
}
dirname_length = p-filepath;
@@ -103,20 +107,30 @@ make_filename( const char *first_part, ... )
n += strlen(s) + 1;
va_end(arg_ptr);
+#ifndef __riscos__
home = NULL;
- if( *first_part == '~' && first_part[1] == '/'
+ if( *first_part == '~' && first_part[1] == DIRSEP_C
&& (home = getenv("HOME")) && *home )
n += strlen(home);
-
name = m_alloc(n);
p = home ? stpcpy(stpcpy(name,home), first_part+1)
: stpcpy(name, first_part);
+#else /* __riscos__ */
+ name = m_alloc(n);
+ p = stpcpy(name, first_part);
+#endif /* __riscos__ */
va_start( arg_ptr, first_part ) ;
while( (s=va_arg(arg_ptr, const char *)) )
- p = stpcpy(stpcpy(p,"/"), s);
+ p = stpcpy(stpcpy(p, DIRSEP_S), s);
va_end(arg_ptr);
+#ifndef __riscos__
return name;
+#else /* __riscos__ */
+ p = gstrans(name);
+ m_free(name);
+ return p;
+#endif /* __riscos__ */
}
@@ -126,11 +140,26 @@ compare_filenames( const char *a, const char *b )
/* ? check whether this is an absolute filename and
* resolve symlinks?
*/
+#ifndef __riscos__
#ifdef HAVE_DRIVE_LETTERS
return ascii_strcasecmp(a,b);
#else
return strcmp(a,b);
#endif
+#else /* __riscos__ */
+ int c = 0;
+ char *abuf, *bbuf;
+
+ abuf = gstrans(a);
+ bbuf = gstrans(b);
+
+ c = stricmp(abuf, bbuf);
+
+ m_free(abuf);
+ m_free(bbuf);
+
+ return c;
+#endif /* __riscos__ */
}
diff --git a/util/http.c b/util/http.c
index c1ab6371c..f77472e9d 100644
--- a/util/http.c
+++ b/util/http.c
@@ -45,6 +45,14 @@
#include "http.h"
+#ifdef __riscos__
+ #define HTTP_PROXY_ENV "GnuPG$HttpProxy"
+ #define HTTP_PROXY_ENV_PRINTABLE "<GnuPG$HttpProxy>"
+#else
+ #define HTTP_PROXY_ENV "http_proxy"
+ #define HTTP_PROXY_ENV_PRINTABLE "$http_proxy"
+#endif
+
#ifdef __MINGW32__
#define sock_close(a) closesocket(a)
#else
@@ -475,12 +483,13 @@ send_request( HTTP_HD hd )
port = hd->uri->port? hd->uri->port : 80;
if( (hd->flags & HTTP_FLAG_TRY_PROXY)
- && (http_proxy = getenv( "http_proxy" )) ) {
+ && (http_proxy = getenv( HTTP_PROXY_ENV )) ) {
PARSED_URI uri;
rc = parse_uri( &uri, http_proxy );
if (rc) {
- log_error("invalid $http_proxy: %s\n", g10_errstr(rc));
+ log_error("invalid " HTTP_PROXY_ENV_PRINTABLE ": %s\n",
+ g10_errstr(rc));
release_parsed_uri( uri );
return G10ERR_NETWORK;
}
diff --git a/util/iobuf.c b/util/iobuf.c
index 5013e6039..db0a31568 100644
--- a/util/iobuf.c
+++ b/util/iobuf.c
@@ -32,6 +32,10 @@
#ifdef HAVE_DOSISH_SYSTEM
#include <windows.h>
#endif
+#ifdef __riscos__
+#include <kernel.h>
+#include <sys/swis.h>
+#endif /* __riscos__ */
#include "memory.h"
#include "util.h"
@@ -921,14 +925,14 @@ iobuf_cancel( IOBUF a )
const char *s;
IOBUF a2;
int rc;
- #ifdef HAVE_DOSISH_SYSTEM
+ #if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
char *remove_name = NULL;
#endif
if( a && a->use == 2 ) {
s = iobuf_get_real_fname(a);
if( s && *s ) {
- #ifdef HAVE_DOSISH_SYSTEM
+ #if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
remove_name = m_strdup ( s );
#else
remove(s);
@@ -945,7 +949,7 @@ iobuf_cancel( IOBUF a )
}
rc = iobuf_close(a);
- #ifdef HAVE_DOSISH_SYSTEM
+ #if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
if ( remove_name ) {
/* Argg, MSDOS does not allow to remove open files. So
* we have to do it here */
diff --git a/util/logger.c b/util/logger.c
index 5f398aa7d..2e9fad5c6 100644
--- a/util/logger.c
+++ b/util/logger.c
@@ -117,6 +117,9 @@ g10_log_print_prefix(const char *text)
fprintf(logfp, "%s%s: %s", pgm_name, pidstring, text );
else
fprintf(logfp, "?%s: %s", pidstring, text );
+#ifdef __riscos__
+ fflush( logfp );
+#endif /* __riscos__ */
}
static void
@@ -128,6 +131,9 @@ print_prefix_f(const char *text, const char *fname)
fprintf(logfp, "%s%s:%s: %s", pgm_name, pidstring, fname, text );
else
fprintf(logfp, "?%s:%s: %s", pidstring, fname, text );
+#ifdef __riscos__
+ fflush( logfp );
+#endif /* __riscos__ */
}
void
@@ -139,6 +145,9 @@ g10_log_info( const char *fmt, ... )
va_start( arg_ptr, fmt ) ;
vfprintf(logfp,fmt,arg_ptr) ;
va_end(arg_ptr);
+#ifdef __riscos__
+ fflush( logfp );
+#endif /* __riscos__ */
}
void
@@ -150,6 +159,9 @@ g10_log_info_f( const char *fname, const char *fmt, ... )
va_start( arg_ptr, fmt ) ;
vfprintf(logfp,fmt,arg_ptr) ;
va_end(arg_ptr);
+#ifdef __riscos__
+ fflush( logfp );
+#endif /* __riscos__ */
}
void
@@ -162,6 +174,9 @@ g10_log_error( const char *fmt, ... )
vfprintf(logfp,fmt,arg_ptr) ;
va_end(arg_ptr);
errorcount++;
+#ifdef __riscos__
+ fflush( logfp );
+#endif /* __riscos__ */
}
void
@@ -174,6 +189,9 @@ g10_log_error_f( const char *fname, const char *fmt, ... )
vfprintf(logfp,fmt,arg_ptr) ;
va_end(arg_ptr);
errorcount++;
+#ifdef __riscos__
+ fflush( logfp );
+#endif /* __riscos__ */
}
void
@@ -186,6 +204,9 @@ g10_log_fatal( const char *fmt, ... )
vfprintf(logfp,fmt,arg_ptr) ;
va_end(arg_ptr);
secmem_dump_stats();
+#ifdef __riscos__
+ fflush( logfp );
+#endif /* __riscos__ */
exit(2);
}
@@ -199,6 +220,9 @@ g10_log_fatal_f( const char *fname, const char *fmt, ... )
vfprintf(logfp,fmt,arg_ptr) ;
va_end(arg_ptr);
secmem_dump_stats();
+#ifdef __riscos__
+ fflush( logfp );
+#endif /* __riscos__ */
exit(2);
}
@@ -217,7 +241,8 @@ g10_log_bug( const char *fmt, ... )
abort();
}
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 )
+#if !defined (__riscos__) \
+ && ( __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 ))
void
g10_log_bug0( const char *file, int line, const char *func )
{
@@ -240,6 +265,9 @@ g10_log_debug( const char *fmt, ... )
va_start( arg_ptr, fmt ) ;
vfprintf(logfp,fmt,arg_ptr) ;
va_end(arg_ptr);
+#ifdef __riscos__
+ fflush( logfp );
+#endif /* __riscos__ */
}
void
@@ -251,6 +279,9 @@ g10_log_debug_f( const char *fname, const char *fmt, ... )
va_start( arg_ptr, fmt ) ;
vfprintf(logfp,fmt,arg_ptr) ;
va_end(arg_ptr);
+#ifdef __riscos__
+ fflush( logfp );
+#endif /* __riscos__ */
}
@@ -264,6 +295,9 @@ g10_log_hexdump( const char *text, const char *buf, size_t len )
for(i=0; i < len; i++ )
fprintf(logfp, " %02X", ((const byte*)buf)[i] );
fputc('\n', logfp);
+#ifdef __riscos__
+ fflush( logfp );
+#endif /* __riscos__ */
}
diff --git a/util/memory.c b/util/memory.c
index a81442d85..9822b1114 100644
--- a/util/memory.c
+++ b/util/memory.c
@@ -73,8 +73,13 @@
#define FNAME(a) m_debug_ ##a
#define FNAMEPRT , const char *info
#define FNAMEARG , info
- #define store_len(p,n,m) do { add_entry(p,n,m, \
+ #ifndef __riscos__
+ #define store_len(p,n,m) do { add_entry(p,n,m, \
info, __FUNCTION__); } while(0)
+ #else
+ #define store_len(p,n,m) do { add_entry(p,n,m, \
+ info, "[" __FILE__ ":" STR(__LINE__) "]" ); } while(0)
+ #endif
#else
#define FNAME(a) m_ ##a
#define FNAMEPRT
@@ -321,9 +326,15 @@ check_allmem( const char *info )
unsigned n;
struct memtbl_entry *e;
- for( e = memtbl, n = 0; n < memtbl_len; n++, e++ )
- if( e->inuse )
+ for( e = memtbl, n = 0; n < memtbl_len; n++, e++ ) {
+ if( e->inuse ) {
+ #ifndef __riscos__
check_mem(e->user_p-4-EXTRA_ALIGN, info);
+ #else
+ check_mem((const byte *) e->user_p-4-EXTRA_ALIGN, info);
+ #endif
+ }
+ }
}
#endif /* M_DEBUG */
@@ -373,7 +384,7 @@ m_print_stats( const char *prefix )
void
m_dump_table( const char *prefix )
{
- #if M_DEBUG
+ #ifdef M_DEBUG
fprintf(stderr,"Memory-Table-Dump: %s\n", prefix);
dump_table();
#endif
@@ -507,7 +518,7 @@ FNAME(free)( void *a FNAMEPRT )
return;
#ifdef M_DEBUG
free_entry(p-EXTRA_ALIGN-4, info);
- #elif M_GUARD
+ #elif defined M_GUARD
m_check(p);
if( m_is_secure(a) )
secmem_free(p-EXTRA_ALIGN-4);
diff --git a/util/riscos.c b/util/riscos.c
new file mode 100644
index 000000000..f62cf4d1c
--- /dev/null
+++ b/util/riscos.c
@@ -0,0 +1,315 @@
+/* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef __RISCOS__C__
+#define __RISCOS__C__
+
+#include <config.h>
+#include <stdarg.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <kernel.h>
+#include <sys/swis.h>
+#include "util.h"
+#include "memory.h"
+
+#define __UNIXLIB_INTERNALS
+#include <sys/unix.h>
+#undef __UNIXLIB_INTERNALS
+
+
+/* RISC OS file open descriptor control list */
+
+struct fds_item {
+ int fd;
+ struct fds_item *next;
+};
+static struct fds_item *fds_list = NULL;
+
+
+/* RISC OS functions */
+
+pid_t
+riscos_getpid(void)
+{
+ _kernel_swi_regs r;
+
+ r.r[0] = 3;
+ if (_kernel_swi(Wimp_ReadSysInfo, &r, &r))
+ log_fatal("Wimp_ReadSysInfo failed: Couldn't get WimpState (R0=3)!\n");
+
+ if (!r.r[0])
+ return (pid_t) 0;
+
+ r.r[0] = 5;
+ if (_kernel_swi(Wimp_ReadSysInfo, &r, &r))
+ log_fatal("Wimp_ReadSysInfo failed: Couldn't get task handle (R0=5)!\n");
+
+ return (pid_t) r.r[0];
+}
+
+int
+riscos_kill(pid_t pid, int sig)
+{
+ _kernel_swi_regs r;
+ int buf[4];
+
+ if (sig)
+ kill(pid, sig);
+
+ r.r[0] = 0;
+ do {
+ r.r[1] = (int) buf;
+ r.r[2] = 16;
+ if (_kernel_swi(TaskManager_EnumerateTasks, &r, &r))
+ log_fatal("TaskManager_EnumerateTasks failed!\n");
+ if (buf[0] == pid)
+ return 0;
+ } while (r.r[0] >= 0);
+
+ return __set_errno(ESRCH);
+}
+
+FILE *
+riscos_fopen(const char *filename, const char *mode)
+{
+ FILE *fp;
+ _kernel_swi_regs r;
+ _kernel_oserror *e;
+ int filetype;
+
+ r.r[0] = 17;
+ r.r[1] = (int) filename;
+ if( e =_kernel_swi(OS_File, &r, &r) )
+ log_fatal("can't retrieve object information for %s\n", filename);
+ if( r.r[0] == 2) {
+ errno = EISDIR;
+ return NULL;
+ }
+ if( r.r[0] == 3) {
+ /* setting file to to non-image file, after fopening, restore */
+ filetype = (r.r[2] >> 8) & 0xfff;
+ set_filetype(filename, 0xfff);
+ fp = fopen(filename, mode);
+ set_filetype(filename, filetype);
+ } else {
+ fp = fopen(filename, mode);
+ }
+ return fp;
+}
+
+int
+riscos_open(const char *filename, int oflag, ...)
+{
+ va_list ap;
+ _kernel_swi_regs r;
+ _kernel_oserror *e;
+ int fd, mode, filetype;
+
+ r.r[0] = 17;
+ r.r[1] = (int) filename;
+ if( e =_kernel_swi(OS_File, &r, &r) )
+ log_fatal("can't retrieve object information for %s\n", filename);
+ if( r.r[0] == 2) {
+ errno = EISDIR;
+ return NULL;
+ }
+
+ va_start(ap, oflag);
+ mode = va_arg(ap, int);
+ va_end(ap);
+
+ if( r.r[0] == 3) {
+ /* setting file to to non-image file, after fopening, restore */
+ filetype = (r.r[2] >> 8) & 0xfff;
+ set_filetype(filename, 0xfff);
+ if (!mode)
+ fd = open(filename, oflag);
+ else
+ fd = open(filename, oflag, mode);
+ set_filetype(filename, filetype);
+ } else {
+ if (!mode)
+ fd = open(filename, oflag);
+ else
+ fd = open(filename, oflag, mode);
+ }
+ return fd;
+}
+
+int
+riscos_fstat(int fildes, struct stat *buf)
+{
+ _kernel_swi_regs r;
+ _kernel_oserror *e;
+ char *filename;
+ int rc, filetype;
+ int handle = (int) __u->fd[fildes].handle;
+
+ r.r[0] = 7;
+ r.r[1] = handle;
+ r.r[2] = 0;
+ r.r[5] = 0;
+ if (e = _kernel_swi(OS_Args, &r, &r))
+ log_fatal("can't convert from file handle to name\n");
+
+ filename = m_alloc(1 - r.r[5]);
+
+ r.r[0] = 7;
+ r.r[1] = handle;
+ r.r[2] = (int) filename;
+ r.r[5] = 1-r.r[5];
+ if (e = _kernel_swi(OS_Args, &r, &r))
+ log_fatal("can't convert from file handle to name\n");
+
+ r.r[0] = 17;
+ r.r[1] = (int) filename;
+ if( e =_kernel_swi(OS_File, &r, &r) )
+ log_fatal("can't retrieve object information for %s\n", filename);
+ if( r.r[0] == 2) {
+ errno = EISDIR;
+ return NULL;
+ }
+ if( r.r[0] == 3) {
+ /* setting file to to non-image file, after fopening, restore */
+ filetype = (r.r[2] >> 8) & 0xfff;
+ set_filetype(filename, 0xfff);
+ rc = fstat(fildes, buf);
+ set_filetype(filename, filetype);
+ } else {
+ rc = fstat(fildes, buf);
+ }
+
+ m_free(filename);
+
+ return rc;
+}
+
+int
+fdopenfile(const char *filename, const int allow_write)
+{
+ struct fds_item *h;
+ static int initialized;
+ int fd = open(filename, allow_write ? O_CREAT | O_RDWR : O_RDONLY);
+ if( fd == -1 )
+ log_fatal("can't open file %s\n", filename);
+
+ if( !initialized ) {
+ atexit( close_fds );
+ initialized = 1;
+ }
+
+ h = fds_list;
+ fds_list = (struct fds_item *) m_alloc( sizeof( struct fds_item ) );
+ fds_list->fd = fd;
+ fds_list->next = h;
+
+ return fd;
+}
+
+void
+close_fds(void)
+{
+ FILE *fp;
+ struct fds_item *h2, *h1 = fds_list;
+ while( h1 ) {
+ h2 = h1->next;
+ fp = fdopen (h2->fd, "a");
+ if (fp)
+ fflush (fp);
+ close( h2->fd );
+ m_free( h1 );
+ h1 = h2;
+ }
+}
+
+int
+renamefile(const char *old, const char *new)
+{
+ _kernel_swi_regs r;
+ _kernel_oserror *e;
+
+ r.r[0] = 25;
+ r.r[1] = (int) old;
+ r.r[2] = (int) new;
+ if (e = _kernel_swi(OS_FSControl, &r, &r)) {
+ 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 0;
+}
+
+char *
+gstrans(const char *old)
+{
+ _kernel_swi_regs r;
+ int c = 0;
+ int size = 256;
+ char *buf, *tmp;
+
+ buf = (char *) m_alloc(size);
+ do {
+ r.r[0] = (int) old;
+ r.r[1] = (int) buf;
+ r.r[2] = size;
+ _kernel_swi_c(OS_GSTrans, &r, &r, &c);
+ if (c) {
+ size += 256;
+ tmp = (char *) m_realloc(buf, size);
+ if (!tmp)
+ log_fatal("can't claim memory for OS_GSTrans buffer!\n");
+ buf = tmp;
+ }
+ } while (c);
+
+ buf[r.r[2]] = '\0';
+ tmp = (char *) m_realloc(buf, r.r[2] + 1);
+ if (!tmp)
+ log_fatal("can't realloc memory after OS_GSTrans!\n");
+
+ return tmp;
+}
+
+void
+set_filetype(const char *filename, const int type)
+{
+ _kernel_swi_regs r;
+
+ r.r[0] = 18;
+ r.r[1] = (int) filename;
+ r.r[2] = type;
+
+ if (_kernel_swi(OS_File, &r, &r))
+ log_fatal("can't set filetype for %s\n", filename);
+}
+
+void
+not_implemented(const char *feature)
+{
+ log_info("%s is not implemented in the RISC OS version!\n", feature);
+}
+
+#endif /* !__RISCOS__C__ */
diff --git a/util/secmem.c b/util/secmem.c
index acf73e40f..148ea1e88 100644
--- a/util/secmem.c
+++ b/util/secmem.c
@@ -168,6 +168,11 @@ lock_pool( void *p, size_t n )
/* It does not make sense to print such a warning, given the fact that
* this whole Windows !@#$% and their user base are inherently insecure
*/
+ #elif defined (__riscos__)
+ /* no virtual memory on RISC OS, so no pages are swapped to disc,
+ * besides we don't have mmap, so we don't use it! ;-)
+ * But don't complain, as explained above.
+ */
#else
log_info("Please note that you don't have secure memory on this system\n");
#endif
@@ -267,6 +272,7 @@ void
secmem_init( size_t n )
{
if( !n ) {
+#ifndef __riscos__
#ifdef USE_CAPABILITIES
/* drop all capabilities */
cap_set_proc( cap_from_text("all-eip") );
@@ -281,6 +287,7 @@ secmem_init( size_t n )
log_fatal("failed to drop setuid\n" );
}
#endif
+#endif /* !__riscos__ */
}
else {
if( n < DEFAULT_POOLSIZE )
diff --git a/util/ttyio.c b/util/ttyio.c
index 3106b5ae5..513026d43 100644
--- a/util/ttyio.c
+++ b/util/ttyio.c
@@ -26,6 +26,11 @@
#include <unistd.h>
#ifdef HAVE_TCGETATTR
#include <termios.h>
+ #ifdef __riscos__
+ #include <kernel.h>
+ #include <sys/swis.h>
+ #undef HAVE_TCGETATTR
+ #endif /* __riscos__ */
#else
#ifdef HAVE_TERMIO_H
/* simulate termios with termio */
@@ -75,10 +80,16 @@ static int batchmode;
static int no_terminal;
#ifdef HAVE_TCGETATTR
-static struct termios termsave;
-static int restore_termios;
+ #ifdef __riscos__
+ struct termios termsave;
+ int restore_termios;
+ #else
+ static struct termios termsave;
+ static int restore_termios;
+ #endif
#endif
+
#ifdef HAVE_TCGETATTR
static void
cleanup(void)
@@ -273,7 +284,12 @@ static char *
do_get( const char *prompt, int hidden )
{
char *buf;
+ #ifndef __riscos__
byte cbuf[1];
+ #else
+ int carry;
+ _kernel_swi_regs r;
+ #endif
int c, n, i;
if( batchmode ) {
@@ -328,6 +344,50 @@ do_get( const char *prompt, int hidden )
if( hidden )
SetConsoleMode(con.in, DEF_INPMODE );
+ #elif defined(__riscos__)
+ do {
+ if (_kernel_swi_c(OS_ReadC, &r, &r, &carry))
+ log_fatal("OS_ReadC failed: Couldn't read from keyboard!\n");
+ c = r.r[0];
+ if (carry != 0)
+ log_fatal("OS_ReadC failed: Return Code = %i!\n", c);
+ if (c == 0xa || c == 0xd) { /* Return || Enter */
+ c = (int) '\n';
+ } else if (c == 0x8 || c == 0x7f) { /* Backspace || Delete */
+ if (i>0) {
+ i--;
+ if (!hidden) {
+ last_prompt_len--;
+ fputc(8, ttyfp);
+ fputc(32, ttyfp);
+ fputc(8, ttyfp);
+ fflush(ttyfp);
+ }
+ } else {
+ fputc(7, ttyfp);
+ fflush(ttyfp);
+ }
+ continue;
+ } else if (c == (int) '\t') { /* Tab */
+ c = ' ';
+ } else if (c > 0xa0) {
+ ; /* we don't allow 0xa0, as this is a protected blank which may
+ * confuse the user */
+ } else if (iscntrl(c)) {
+ continue;
+ }
+ if(!(i < n-1)) {
+ n += 50;
+ buf = m_realloc(buf, n);
+ }
+ buf[i++] = c;
+ if (!hidden) {
+ last_prompt_len++;
+ fputc(c, ttyfp);
+ fflush(ttyfp);
+ }
+ } while (c != '\n');
+ i = (i>0) ? i-1 : 0;
#else /* unix version */
if( hidden ) {
#ifdef HAVE_TCGETATTR