ftp.nice.ch/pub/next/tools/archiver/Opener.3.4b.Utils.s.tar.gz#/Opener.3.4a.Utils.s/mpack/amigados.c

This is amigados.c in view mode; [Download] [Up]

/* (c) Copyright 1993 by Mike W. Meyer
 *
 * Permission to use, copy, modify, distribute, and sell this software
 * and its documentation for any purpose is hereby granted without
 * fee, provided that the above copyright notice appear in all copies
 * and that both that copyright notice and this permission notice
 * appear in supporting documentation, and that the name of Mike W.
 * Meyer not be used in advertising or publicity pertaining to
 * distribution of the software without specific, written prior
 * permission.  Mike W. Meyer makes no representations about the
 * suitability of this software for any purpose.  It is provided "as
 * is" without express or implied warranty.
 *
 * MIKE W. MEYER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
 * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS, IN NO EVENT SHALL MIKE W. MEYER BE LIABLE FOR ANY SPECIAL,
 * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
 * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
 * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include <exec/types.h>
#include <exec/exec.h>
#include <dos/dos.h>

#include <libraries/netsupport.h>

#ifdef __SASC
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/netsupport.h>
#else
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/netsupport_protos.h>
#endif

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <dos.h>
#include <ctype.h>
#include <errno.h>

#include "xmalloc.h"
#include "common.h"

#define BADCHARS        "#?()|[]%<>:;$&*\\\ \t\`\""
#define FILELEN         29              /* Max file name length */

int overwrite_files = 0 ;
static char *output_fname = NULL;
extern int errno, _OSERR ;
void os_perror(char *) ;
char *myGetConfig(char *, char *) ;
int __buffsize = 8192 ;
int didchat;

/* Generate a message-id */
char *
os_genid(void) {
        static struct Task *task = NULL ;
        static time_t now ;
        static char hostname[32], domainname[32] ;
        char *result ;

        if (task == NULL) {
                task = FindTask(NULL) ;
                time(&now) ;

                strcpy(hostname, myGetConfig(NODENAME, "random-amiga"));
                if (strchr(hostname, '.')) domainname[0] = '\0' ;
                else strcpy(domainname, myGetConfig(DOMAINNAME, ".random-domain"));
                if (domainname[0] && domainname[0] != '.') strcat(hostname, ".") ;
                }
        result = malloc(25 + strlen(hostname) + strlen(domainname)) ;
        sprintf(result, "%d.%d@%s%s", (long) task, now++, hostname, domainname) ;
        return result ;
        }

/* Create and return a directory for a message-id */
char *
os_idtodir(char *id) {
static char buf[512] ;
        char *p, save ;

        strcpy(buf, myGetConfig("METAMAIL_P_DIR", "T:"));

        if (!(p = myGetConfig("USERNAME", NULL)))
                p = myGetConfig("USER", "anonymous");
        AddPart(buf, p, sizeof(buf)) ;

        if (mkdir(buf) == -1 && errno != EEXIST && _OSERR != ERROR_OBJECT_EXISTS) {
                os_perror(buf) ;
                return NULL ;
                }

        p = buf + strlen(buf) ;
        *p++ = '/' ;
        save = id[FILELEN] ;
        id[FILELEN] = '\0' ;
        while (*id) {
                if (isprint(*id) && !strchr(BADCHARS, *id)) *p++ = *id ;
                id += 1 ;
                }
        *p  = '\0' ;
        id[FILELEN] = save ;

        if (mkdir(buf) == -1 && errno != EEXIST && _OSERR != ERROR_OBJECT_EXISTS) {
                os_perror(buf) ;
                return NULL ;
                }
        strcpy(p, "/") ;
        return buf ;
        }

/* Delete the directory created by os_idtodir() */
void
os_donewithdir(char *dir) {

        /* Chop off trailing slash */
        dir[strlen(dir) - 1] = '\0' ;
        rmdir(dir) ;
        }

/* Create a new file of name "fname". Clean up the name first */
FILE *
os_newtypedfile(char *fname, char *contentType, int binary, params contentParams) {
        char *p, *name, *description, buf[512] ;
        FILE *outfile ;
        static int filesuffix = 0 ;

        name = FilePart(fname) ;

        /* No BADCHARS */
        for (p = name; *p; p += 1)
                if (!isprint(*p) || strchr(BADCHARS, *p)) *p = 'X' ;

        /* Add a count if we don't have a name, or we aren't overwriting */
        if (!*fname || !overwrite_files) {
                if (*name) strcpy(buf, name) ;
                else {
                        name = "part" ;
                        sprintf(buf, "part.%d", ++filesuffix) ;
                        }
                while (outfile = fopen(buf, "r")) {
                        if (outfile) fclose(outfile) ;
                        sprintf(buf, "%s.%d", name, ++filesuffix) ;
                        }
                name = buf ;
                fclose(outfile) ;
                }

        if (!(outfile = fopen(name, "w"))) os_perror(name) ;

        if (output_fname) free(output_fname) ;
        output_fname = strsave(name) ;
        description = xmalloc(strlen(name) + 6) ;
        strcpy(description, name) ;
        strcat(description, ".desc") ;
        (void) rename(TEMPFILENAME, description) ;
        free(description) ;

        fprintf(stdout, "%s (%s)\n", output_fname, contentType) ;
        didchat = 1;
        return outfile ;
        }

/* Warn user that MD5 digest didn't match */
void
os_warnMD5mismatch(void) {
        char *warning;

        warning = xmalloc(strlen(output_fname) + 100);
        sprintf(warning, "%s was corrupted in transit", output_fname);
        warn(warning);
        free(warning);
        }

/* Report an error (in errno) concerning a filename */
void
os_perror(char *file) {
        if (errno != EOSERR) perror(file);
        else poserr(file) ;
        }

/*
 * This getenv will use the WB2.0 calls if you have the 2.0
 * rom. If not, it resorts to looking in the ENV: directory.
 */

char *
getenv (const char *name) {
        FILE *fp;
        char *ptr;
        static char value[256] ;
        static char buf[256] ;

        /* 2.0 style? */
        if (DOSBase->dl_lib.lib_Version >= 36) {
                if (GetVar ((char *)name,value,256,0L) == -1) return NULL;
        } else {
                if (strlen (name) > 252) return NULL;
                strcpy (buf,"ENV:");
                strcpy (&buf[4],name);
                if (! (fp = fopen(buf,"r"))) return NULL;
                for (ptr = value; (*ptr=getc(fp))!=EOF
                        && *ptr != '\n'
                        && ++ptr < &value[256];);
                fclose(fp);
                *ptr = 0;
                }
        return value;
        }

/* Get configuarion, either from a file or from a variable */

char * myGetConfig(char *keyword, char *def) {
        char *entry;

        if (NetSupportBase)
                return (char *) GetConfig(NULL, keyword, NULL, def);


        entry = getenv(keyword);  /* Library is NOT available */
        return ((entry) ? entry : def);
        }

/* (Don't) Handle a BinHex'ed file */

int
os_binhex(FILE *infile, int dummy1, int dummy2) {
        return 1;
        }
/*
 * Close a file opened by os_newTypedFile()
 */
int
os_closetypedfile(FILE *outfile) {
        return fclose(outfile);
        }

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.