From 191795d14b2a4570b9022ee8f4a19a9249c86ff7 Mon Sep 17 00:00:00 2001 From: Stefan Bellon Date: Mon, 28 Oct 2002 13:27:18 +0000 Subject: [PATCH] filetype support for RISC OS --- g10/ChangeLog | 8 +++++ g10/build-packet.c | 24 ++++++++++++++ g10/mainproc.c | 2 +- g10/plaintext.c | 40 +++++++++++++++++++---- include/ChangeLog | 4 +++ include/util.h | 3 ++ keyserver/ChangeLog | 8 +++++ keyserver/gpgkeys_hkp.c | 8 +++++ scripts/ChangeLog | 4 +++ scripts/conf-riscos/include/config.h | 24 ++++++++------ util/ChangeLog | 9 ++++++ util/fileutil.c | 6 ++-- util/riscos.c | 48 +++++++++++++++++++--------- 13 files changed, 153 insertions(+), 35 deletions(-) diff --git a/g10/ChangeLog b/g10/ChangeLog index 699d0776c..d50246f2b 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,11 @@ +2002-10-28 Stefan Bellon + + * build-packet.c (calc_plaintext, do_plaintext): Added filetype + handling for RISC OS' file types. + + * plaintext.c (handle_plaintext) [__riscos__]: Added filetype + handling for RISC OS' file types. + 2002-10-23 Werner Koch * pubkey-enc.c (get_it): Fix segv, test for revoked only when PK diff --git a/g10/build-packet.c b/g10/build-packet.c index da1cbbe39..a1f93094e 100644 --- a/g10/build-packet.c +++ b/g10/build-packet.c @@ -528,7 +528,14 @@ do_pubkey_enc( IOBUF out, int ctb, PKT_pubkey_enc *enc ) static u32 calc_plaintext( PKT_plaintext *pt ) { +#ifndef __riscos__ return pt->len? (1 + 1 + pt->namelen + 4 + pt->len) : 0; +#else + /* Under RISC OS, we add ",xxx" to the file name in order to + be able to recreate the correct file type on the recipients' + side. Therefore we need 4 bytes more. */ + return pt->len? (1 + 1 + pt->namelen + 4 + pt->len + 4) : 0; +#endif } static int @@ -541,9 +548,26 @@ do_plaintext( IOBUF out, int ctb, PKT_plaintext *pt ) write_header(out, ctb, calc_plaintext( pt ) ); iobuf_put(out, pt->mode ); +#ifndef __riscos__ iobuf_put(out, pt->namelen ); for(i=0; i < pt->namelen; i++ ) iobuf_put(out, pt->name[i] ); +#else + /* Under RISC OS, we add ",xxx" to the file name in order to + be able to recreate the correct file type on the recipients' + side. Therefore we need 4 bytes more. */ + iobuf_put(out, pt->namelen + 4); + for(i=0; i < pt->namelen; i++ ) + if( pt->name[i] != '/' ) + iobuf_put(out, pt->name[i] ); + else + iobuf_put(out, '.' ); + i = riscos_get_filetype( iobuf_get_real_fname( pt->buf ) ); + iobuf_put(out, ','); + iobuf_put(out, "0123456789abcdef"[(i >> 8) & 0xf]); + iobuf_put(out, "0123456789abcdef"[(i >> 4) & 0xf]); + iobuf_put(out, "0123456789abcdef"[(i >> 0) & 0xf]); +#endif if( write_32(out, pt->timestamp ) ) rc = G10ERR_WRITE_FILE; diff --git a/g10/mainproc.c b/g10/mainproc.c index f9be17600..0fc3a8546 100644 --- a/g10/mainproc.c +++ b/g10/mainproc.c @@ -1110,7 +1110,7 @@ do_proc_packets( CTX c, IOBUF a ) any_data = 1; if( rc ) { free_packet(pkt); - /* stop processing hwne an invalid packet has been encountered + /* stop processing when an invalid packet has been encountered * but don't do so when we are doing a --list-packet. */ if( rc == G10ERR_INVALID_PACKET && opt.list_packets != 2 ) break; diff --git a/g10/plaintext.c b/g10/plaintext.c index b12fb0f11..ffb8a7053 100644 --- a/g10/plaintext.c +++ b/g10/plaintext.c @@ -25,7 +25,7 @@ #include #include #ifdef HAVE_DOSISH_SYSTEM - #include /* for setmode() */ +# include /* for setmode() */ #endif #include "util.h" @@ -55,6 +55,9 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, int rc = 0; int c; int convert = pt->mode == 't'; +#ifdef __riscos__ + int filetype = 0xfff; +#endif /* create the filename as C string */ if( nooutput ) @@ -75,9 +78,29 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, rc = G10ERR_CREATE_FILE; goto leave; } +#ifdef __riscos__ + /* If there's a ,xxx extension in the embedded filename, + get filetype from it and use it later on */ + filetype = riscos_get_filetype_from_string( pt->name, pt->namelen ); + c = riscos_get_filetype_from_string( fname, strlen(fname) ); + if( c != 0xfff && filetype == 0xfff) + filetype = c; +#endif } else { fname = make_printable_string( pt->name, pt->namelen, 0 ); +#ifdef __riscos__ + /* If there's a ,xxx extension in the embedded filename, + get filetype from it and use it later on, remove ,xxx from + actual filename */ + if( fname[strlen(fname) - 4] == ',' ) { + filetype = riscos_get_filetype_from_string( pt->name, pt->namelen ); + fname[strlen(fname) - 4] = 0; + } + for( c=0; fname[c]; ++c) + if( fname[c] == '.' ) + fname[c] = '/'; +#endif } if( nooutput ) @@ -85,9 +108,9 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, else if( !*fname || (*fname=='-' && !fname[1])) { /* no filename or "-" given; write to stdout */ fp = stdout; - #ifdef HAVE_DOSISH_SYSTEM +#ifdef HAVE_DOSISH_SYSTEM setmode ( fileno(fp) , O_BINARY ); - #endif +#endif } else { while( !overwrite_filep (fname) ) { @@ -113,6 +136,9 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, #endif /* __riscos__ */ goto leave; } +#ifdef __riscos__ + riscos_set_filetype_by_number(fname, filetype); +#endif if( !pt->is_partial ) { /* we have an actual length (which might be zero). */ @@ -127,10 +153,10 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, } if( mfx->md ) md_putc(mfx->md, c ); - #ifndef HAVE_DOSISH_SYSTEM +#ifndef HAVE_DOSISH_SYSTEM if( c == '\r' ) /* convert to native line ending */ continue; /* fixme: this hack might be too simple */ - #endif +#endif if( fp ) { if( putc( c, fp ) == EOF ) { log_error("Error writing to `%s': %s\n", @@ -174,10 +200,10 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx, while( (c = iobuf_get(pt->buf)) != -1 ) { if( mfx->md ) md_putc(mfx->md, c ); - #ifndef HAVE_DOSISH_SYSTEM +#ifndef HAVE_DOSISH_SYSTEM if( convert && c == '\r' ) continue; /* fixme: this hack might be too simple */ - #endif +#endif if( fp ) { if( putc( c, fp ) == EOF ) { log_error("Error writing to `%s': %s\n", diff --git a/include/ChangeLog b/include/ChangeLog index d0394ef69..2fb44b8b0 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,7 @@ +2002-10-28 Stefan Bellon + + * util.h [__riscos__]: Added prototypes for new filetype support. + 2002-10-21 Werner Koch * util.h [__CYGWIN32__]: Don't need the registry prototypes. diff --git a/include/util.h b/include/util.h index a053c68be..7b6c8755d 100644 --- a/include/util.h +++ b/include/util.h @@ -267,6 +267,9 @@ int vasprintf ( char **result, const char *format, va_list args); #include void riscos_global_defaults(void); #define RISCOS_GLOBAL_STATICS(a) const char *__dynamic_da_name = (a); +int riscos_get_filetype_from_string(const char *string, int len); +int riscos_get_filetype(const char *filename); +void riscos_set_filetype_by_number(const char *filename, int type); void riscos_set_filetype(const char *filename, const char *mimetype); pid_t riscos_getpid(void); int riscos_kill(pid_t pid, int sig); diff --git a/keyserver/ChangeLog b/keyserver/ChangeLog index 50166ea4b..9f23ae10e 100644 --- a/keyserver/ChangeLog +++ b/keyserver/ChangeLog @@ -1,3 +1,7 @@ +2002-10-28 Stefan Bellon + + * gpgkeys_hkp.c: Tidied up RISC OS initializations. + 2002-10-24 David Shaw * gpgkeys_hkp.c (main), gpgkeys_ldap.c (main): Add -V flag to @@ -27,6 +31,10 @@ * gpgkeys_hkp.c (get_key): Properly respond with KEY FAILED (to gpg) and "key not found" (to user) on failure. +2002-09-12 Stefan Bellon + + * gpgkeys_hkp.c: Tidied up RISC OS initializations. + 2002-09-09 Werner Koch * gpgkeys_hkp.c (send_key, get_key, search_key): Check return diff --git a/keyserver/gpgkeys_hkp.c b/keyserver/gpgkeys_hkp.c index 8dee66ff4..877415ce9 100644 --- a/keyserver/gpgkeys_hkp.c +++ b/keyserver/gpgkeys_hkp.c @@ -46,6 +46,10 @@ struct keylist struct keylist *next; }; +#ifdef __riscos__ +RISCOS_GLOBAL_STATICS("HKP Keyfetcher Heap") +#endif /* __riscos__ */ + static int urlencode_filter( void *opaque, int control, IOBUF a, byte *buf, size_t *ret_len) @@ -649,6 +653,10 @@ int main(int argc,char *argv[]) int failed=0; struct keylist *keylist=NULL,*keyptr=NULL; +#ifdef __riscos__ + riscos_global_defaults(); +#endif + console=stderr; fprintf(console, diff --git a/scripts/ChangeLog b/scripts/ChangeLog index 731c1c5ff..28ada8eb2 100644 --- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,7 @@ +2002-10-28 Stefan Bellon + + * conf-riscos/include/config.h: Updated to reflect latest changes. + 2002-10-26 David Shaw * gnupg.spec.in: Use new path for keyserver helpers, /usr/lib is diff --git a/scripts/conf-riscos/include/config.h b/scripts/conf-riscos/include/config.h index b95bef608..41839aed7 100644 --- a/scripts/conf-riscos/include/config.h +++ b/scripts/conf-riscos/include/config.h @@ -86,6 +86,8 @@ /* Define if your locale.h file contains LC_MESSAGES. */ #define HAVE_LC_MESSAGES 1 +#define LOCALEDIR "" + /* Define to 1 if NLS is requested. */ #define ENABLE_NLS 1 @@ -154,7 +156,8 @@ #define SIZEOF_UNSIGNED_LONG 4 /* The number of bytes in a unsigned long long. */ -#define SIZEOF_UNSIGNED_LONG_LONG 0 +/* Is defined later on */ +/* #define SIZEOF_UNSIGNED_LONG_LONG 0 */ /* The number of bytes in a unsigned short. */ #define SIZEOF_UNSIGNED_SHORT 2 @@ -361,29 +364,30 @@ /* define if compiled symbols have a leading underscore */ #define WITH_SYMBOL_UNDERSCORE 1 -#ifdef IS_DEVELOPMENT_VERSION - #define DEBUG 1 -/* #define M_DEBUG */ - #define M_GUARD 1 -#endif - -#define USE_RNDRISCOS 1 - /* RISC OS specifica */ #if (__CC_NORCROFT == 1) /* Norcroft */ # undef __GNUC__ # define __GNUC_MINOR__ 0 # define __GLIBC__ 0 # define __attribute__(x) +# define SIZEOF_UNSIGNED_LONG_LONG 0 # if (__CC_NORCROFT_VERSION < 544) /* old version of Norcroft */ # define inline __inline # define STR(a) #a # define __func__ "[" __FILE__ ":" STR(__LINE__) "]" # endif #else /* gcc */ +# define SIZEOF_UNSIGNED_LONG_LONG 8 #endif -/* #define USE_EXTERNAL_HKP */ +#define USE_RNDRISCOS 1 +#define USE_TIGER 1 + +#ifdef IS_DEVELOPMENT_VERSION +# define DEBUG 1 +/*# define M_DEBUG */ +# define M_GUARD 1 +#endif #include "g10defs.h" diff --git a/util/ChangeLog b/util/ChangeLog index 5d4cb7de9..37f63e80a 100644 --- a/util/ChangeLog +++ b/util/ChangeLog @@ -1,3 +1,12 @@ +2002-10-28 Stefan Bellon + + * fileutil.c (make_basename) [__riscos__]: Cut off RISC OS' filing + systems from filepath. + + * riscos.c (riscos_get_filetype_from_string, riscos_get_filetype): + Added. + (riscos_set_filetype_by_number): Made public. + 2002-10-21 Werner Koch * secmem.c (lock_pool) [__CYGWIN__]: Don't print secmem warning. diff --git a/util/fileutil.c b/util/fileutil.c index b63bbd3b0..b7e7f233b 100644 --- a/util/fileutil.c +++ b/util/fileutil.c @@ -44,10 +44,12 @@ make_basename(const char *filepath) char *p; if ( !(p=strrchr(filepath, DIRSEP_C)) ) - #ifdef HAVE_DRIVE_LETTERS +#ifdef HAVE_DRIVE_LETTERS if ( !(p=strrchr(filepath, '\\')) ) if ( !(p=strrchr(filepath, ':')) ) - #endif +#elif defined(__riscos__) + if ( !(p=strrchr(filepath, ':')) ) +#endif { return m_strdup(filepath); } diff --git a/util/riscos.c b/util/riscos.c index c64da3751..a66a05ad3 100644 --- a/util/riscos.c +++ b/util/riscos.c @@ -36,15 +36,9 @@ #define __UNIXLIB_INTERNALS #include +#include #undef __UNIXLIB_INTERNALS -/* RISC OS specific defines that are not yet in UnixLib */ - -#define MimeMap_Translate 0x50B00 -#define MMM_TYPE_RISCOS 0 -#define MMM_TYPE_RISCOS_STRING 1 -#define MMM_TYPE_MIME 2 -#define MMM_TYPE_DOT_EXTN 3 /* RISC OS file open descriptor control list */ @@ -76,14 +70,6 @@ is_read_only(const char *filename) return 0; } -static 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); -} - /* exported RISC OS functions */ void @@ -93,6 +79,38 @@ riscos_global_defaults(void) __feature_imagefs_is_file = 1; } +int +riscos_get_filetype_from_string(const char *string, int len) +{ + int result = 0xfff; + + if (string[len - 4] != ',') + return 0xfff; + + 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(6), 23, filename, &result)) + log_fatal("Can't get filetype for file %s!\n", filename); + + return result; +} + +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(const char *filename, const char *mimetype) {