DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T o

⟦a18ba4356⟧ TextFile

    Length: 7168 (0x1c00)
    Types: TextFile
    Names: »ops.c«

Derivation

└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
    └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« 
        └─⟦d3ac74d73⟧ 
            └─⟦this⟧ »isode-5.0/others/idist/ops.c« 

TextFile

/* idist.c - remote distribution - initiator */

#ifndef	lint
static char *rcsid = "$Header: /f/osi/others/idist/RCS/ops.c,v 6.0 89/03/18 23:36:58 mrose Rel $";
#endif

/* 
 * $Header: /f/osi/others/idist/RCS/ops.c,v 6.0 89/03/18 23:36:58 mrose Rel $
 *
 * This file is entirely new, and handles the dispatching of the
 * remote operations to the server. It tries hard to remove all hint
 * of the ISODE parts and to hide the posy generated structures.
 *
 * Julian Onions <jpo@cs.nott.ac.uk>
 * Nottingham University Computer Science.
 * 
 * $Log:	ops.c,v $
 * Revision 6.0  89/03/18  23:36:58  mrose
 * Release 5.0
 * 
 */


#include <stdio.h>
#include "Idist-ops.h"		/* operation definitions */
#include "Idist-types.h"	/* type definitions */
#include "defs.h"

extern struct type_Idist_FileSpec *makefs ();
static void print_ia5list ();

int	basic_error ();
int	null_result (), ia5_result (), query_result ();

int	result_value;

int  initdir (flag, dest)
int	flag;
char	*dest;
{
    struct qbuf *qb;
    struct type_Idist_InitDir *idp;

    qb = str2qb (dest, strlen(dest), 1);
    idp = (struct type_Idist_InitDir *) malloc (sizeof *idp);
    if (idp == (struct type_Idist_InitDir *)0)
	    adios ("memory", "out of");
    if (flag) {
	    idp -> offset = type_Idist_InitDir_destdir;
	    idp -> un.destdir = qb;
    }
    else {
	    idp -> offset = type_Idist_InitDir_nodestdir;
	    idp -> un.nodestdir = qb;
    }
    return invoke (operation_Idist_init, (caddr_t)idp,
		   free_Idist_init_argument,
		   null_result,
		   basic_error);
}

int	transfer (type, opts, mode, size, mtime, uname, group, name, lname)
unsigned short type, mode;
time_t	mtime;
off_t	size;
int	opts;
char	*uname, *group, *name, *lname;
{
	struct type_Idist_FileSpec *fs;

	fs = makefs (type, opts, mode, size, mtime, 
		     uname, group, name, lname);

	return invoke (operation_Idist_transfer, (caddr_t)fs,
		       free_Idist_transfer_argument,
		       ia5_result,
		       basic_error);
}


terminate (type, status)
int	type;
int	status;
{
	struct type_Idist_TermStatus *ts;
	struct type_Idist_FileType	*makeftype ();

	if ((ts = (struct type_Idist_TermStatus *) malloc ( sizeof *ts)) == NULL)
		adios ("memory", "out of");
	ts -> filetype = makeftype ((unsigned short)type);
	ts -> status = (status == OK) ? 1 : 0;
	return invoke (operation_Idist_terminate, (caddr_t)ts,
		       free_Idist_terminate_argument,
		       null_result,
		       basic_error);
}

tran_data (data, len)
char	*data;
int	len;
{
	struct type_Idist_Data *dat;

	dat = str2qb (data, len, 1);

	return invoke (operation_Idist_data, (caddr_t)dat,
		       free_Idist_data_argument,
		       null_result,
		       basic_error);
}

int	runspecial (cmd)
char	*cmd;
{
	struct type_UNIV_IA5String *ia5;

	ia5 = str2qb (cmd, strlen(cmd), 1);

	return invoke (operation_Idist_special, (caddr_t)ia5,
		       free_Idist_special_argument,
		       ia5_result,
		       basic_error);
}

static time_t	cmtime;
static off_t	csize;
static unsigned short cmode;

int	rquery (file, mtime, size, mode)
char	*file;
time_t	*mtime;
off_t	*size;
unsigned short *mode;
{
	struct type_UNIV_IA5String *ia5;
	int	retval;

	ia5 = str2qb (file, strlen(file), 1);

	retval = invoke (operation_Idist_query, (caddr_t)ia5,
			 free_Idist_query_argument,
			 query_result,
			 basic_error);
	if (retval == NOTOK)
		return NOTOK;
	if (result_value != OK)
		return result_value;
	else {
		*mtime = cmtime;
		*mode = cmode;
		*size = csize;
		return OK;
	}
}

/* ARGSUSED */
query_result (sd, id, error, qr, roi)
int	sd, id, error;
struct type_Idist_QueryResult *qr;
struct RoSAPindication *roi;
{
	long	convtime ();

	result_value = OK;
	if (qr -> offset == type_Idist_QueryResult_doesntExist) {
		result_value = DONE;
		return OK;
	}
	else {
		cmode = 0;
		switch (qr -> un.doesExist -> filetype -> parm) {
		    case int_Idist_FileType_directory:
			cmode = S_IFDIR;
		    case int_Idist_FileType_symlink:
			if (cmode == 0)
				cmode = S_IFLNK;
		    case int_Idist_FileType_regular:
			if (cmode == 0)
				cmode = S_IFREG;
			cmtime = convtime (qr -> un.doesExist -> filemtime);
			csize = qr -> un.doesExist -> filesize;
			break;

		    default:
			result_value = NOTOK;
			return OK;
		}
		result_value = OK;
		return OK;
	}
}

static int copts;
rmchk (opts)
int	opts;
{
	int	listcdir_result ();

	copts = opts;
	return invoke (operation_Idist_listcdir, (caddr_t)NULL,
		    free_Idist_listcdir_argument,
		    listcdir_result,
		    basic_error);
}

/* ARGSUSED */
int	listcdir_result (sd, id, error, files, roi)
int	sd, id, error;
struct type_Idist_FileList *files;
struct RoSAPindication *roi;
{
	struct type_Idist_FileList *fl;
	char	buf[BUFSIZ];
	char	*name;
	extern	char target[];
	struct stat stb;
	extern char basename[];

	for (fl = files; fl; fl = fl -> next) {
		name = qb2str (fl -> FileSpec -> filename);
		(void) sprintf (buf, "%s/%s", target, name);
		if (lstat (buf, &stb) < 0) {
			if (copts & VERIFY)
				printf ("need to remove: %s/%s\n",
					basename, name);
			else
				(void) deletefile (name,
						   fl -> FileSpec -> filetype -> parm);
		}
		free (name);
	}
	return OK;
}

deletefile (str, mode)
char	*str;
int	mode;
{
	struct type_UNIV_IA5String *ia5;
	char	buffer[BUFSIZ];

	switch (mode) {
	    case int_Idist_FileType_regular:
	    case int_Idist_FileType_hardlink:
		mode = S_IFREG;
		break;
	    case int_Idist_FileType_directory:
		mode = S_IFDIR;
		break;
	    case int_Idist_FileType_symlink:
		mode = S_IFLNK;
		break;
	    default:
		mode = 0;
		break;
	}

	(void) sprintf (buffer, "%s/%s", basename, str);
	if ((copts & QUERYM) && !query ("Delete", mode, buffer))
		return OK;

	ia5 = str2qb (str, strlen(str), 1);

	return invoke (operation_Idist_deletefile, (caddr_t) ia5,
		       free_Idist_deletefile_argument,
		       ia5_result,
		       basic_error);
}


/* ARGSUSED */
static int	basic_error (sd, id, error, parameter, roi)
int	sd, id, error;
struct type_Idist_IA5List *parameter;
struct RoSAPindication *roi;
{
	struct RyError *rye;

	if (error == RY_REJECT) {
		advise (NULLCP, "%s", RoErrString ((int) parameter));
		result_value = NOTOK;
		return OK;
	}

	if (rye = finderrbyerr (table_Idist_Errors, error))
		advise (NULLCP, "%s", rye -> rye_name);
	else
		advise (NULLCP, "Error %d", error);
	
	if (parameter)
		print_ia5list (parameter);

	result_value = NOTOK;
	return OK;
}

/* ARGSUSED */

static null_result (sd, id, dummy, result, roi)
int     sd,
        id,
        dummy;
caddr_t result;
struct RoSAPindication *roi;
{
	result_value = OK;
	return OK;
}

/* ARGSUSED */
static int ia5_result (sd, id, parameter, result, roi)
int     sd,
        id,
        parameter;
caddr_t result;
struct RoSAPindication *roi;
{
	result_value = OK;
	print_ia5list ((struct type_Idist_IA5List *)result);
	return OK;
}

static  void print_ia5list (ia5)
register struct type_Idist_IA5List *ia5;
{
    register struct qbuf *p,
                         *q;
    
    for (; ia5; ia5 = ia5 -> next) {
        p = ia5 -> IA5String;
        for (q = p -> qb_forw; q != p ; q = q -> qb_forw)
            printf ("%*.*s", q -> qb_len, q -> qb_len, q -> qb_data);
        printf ("\n");
    }
}