AcePerl
view release on metacpan or search on metacpan
acelib/aceclientlib.c view on Meta::CPAN
/* File: aceclientlib.c
* Author: Jean Thierry-Mieg (mieg@kaa.cnrs-mop.fr)
* Copyright (C) J Thierry-Mieg and R Durbin, 1992
*-------------------------------------------------------------------
* This file is part of the ACEDB genome database package, written by
* Richard Durbin (MRC LMB, UK) rd@mrc-lmb.cam.ac.uk, and
* Jean Thierry-Mieg (CRBM du CNRS, France) mieg@kaa.cnrs-mop.fr
*
* Description:
* I started from a sample code generated by rpcgen on Solaris
* and a first version by Peter Kocab.
* Does not require any ACEDB library code.
*
* Exported functions:
openServer()
closeServer()
askServer()
askServerBinary()
* HISTORY:
* Last edited: Sep 10 19:48 1997 (rd)
* Created: Wed Nov 25 20:02:45 1992 (mieg)
*-------------------------------------------------------------------
*/
/* $Id: aceclientlib.c,v 1.1 2002/11/14 20:00:06 lstein Exp $ */
#include "mystdlib.h"
#define __malloc_h
#include <errno.h>
#include <rpc/rpc.h>
#include "rpcace.h"
#include "aceclient.h"
#include "regular.h"
BOOL accessDebug = FALSE ;
#include <signal.h> /* for alarm stuff */
#include <unistd.h> /* for pause() */
#include <sys/time.h> /* for setitimer() etc. */
static void wakeUp (int x)
{
static int sig = 0 ;
sig = x ;
signal (SIGALRM, wakeUp) ; /* reregister, otherwise you exit on SGI and LINUX */
}
static FILE *magicFileOpen (char *name)
{
FILE *f ;
f = fopen (name, "r") ;
if (f)
{ if (accessDebug)
printf ("// found %s immediately\n", name) ;
return f ;
}
/* test if directory readable by trying to open the file "." in
the directory. filcheck() and access() won't work in setuid()
situations.
*/
{ char *dirName, *cp ;
dirName = strnew (name, 0) ;
for (cp = dirName ; *cp ; ++cp) ;
while (cp > dirName && *cp != '/') --cp ;
*++cp = '.' ;
*++cp = 0 ;
if (!(f = fopen(dirName, "r")))
{ if (accessDebug)
printf ("// directory %s not readable\n", dirName) ;
return 0 ;
}
fclose (f) ;
}
{ int i ;
struct itimerval tval ;
signal (SIGALRM, wakeUp) ;
tval.it_interval.tv_sec = 0 ;
tval.it_interval.tv_usec = 5000 ; /* 5ms reload */
tval.it_value.tv_sec = 0 ;
tval.it_value.tv_usec = 1000 ; /* 1ms initial */
setitimer (ITIMER_REAL, &tval, 0) ;
for (i = 0 ; i < 1000 ; ++i) /* 5 seconds */
{ pause () ; /* wait until SIGALRM handled */
f = fopen (name, "r") ;
if (f)
{ if (accessDebug)
printf ("// found %s after %d msecs\n", name, 5*i+1) ;
tval.it_interval.tv_usec = tval.it_value.tv_usec = 0 ;
setitimer (ITIMER_REAL, &tval, 0) ;
return f ;
}
}
if (accessDebug)
printf ("// failed to find %s after %d msecs\n", name, 5*i+1) ;
tval.it_interval.tv_usec = tval.it_value.tv_usec = 0 ;
setitimer (ITIMER_REAL, &tval, 0) ;
}
return 0 ;
}
static int getMagic (int magic1, char *nm)
{ int magic = 0, magic2 = 0, magic3 = 0 ;
FILE *f ;
int level ;
char *cp ;
if (magic1 < 0) magic1 = -magic1 ; /* old system */
if (!nm || !*nm) return 0 ;
freeinit() ;
level = freesettext(nm,0) ;
if (!freecard(level))
goto fin ;
cp = freeword () ;
if (!cp)
{ messerror ("Can't obtain write pass name from server") ;
goto fin ;
}
if (accessDebug)
printf ("// Write pass file: %s\n", cp) ;
if (strcmp(cp, "NON_WRITABLE"))
{ f = magicFileOpen (cp) ;
if (f)
{ if (fscanf(f, "%d", &magic3) != 1)
messerror ("failed to read file") ;
fclose(f) ;
}
}
if ((cp = freeword ()) &&
!magic3) /* must be able to read if can write */
{ if (accessDebug)
printf ("// Read pass file: %s\n", cp) ;
if (strcmp(cp, "PUBLIC") && strcmp(cp,"RESTRICTED"))
{ f = magicFileOpen (cp) ;
if (!f)
{ messout ("// Access to this database is restricted, sorry (can't open pass file)\n") ;
goto fin ;
}
if (fscanf(f, "%d", &magic2) != 1)
messerror ("failed to read file") ;
fclose(f) ;
}
}
magic = magic1 ;
if (magic2)
magic = magic1 * magic2 % 73256171 ;
if (magic3)
magic = magic1 * magic3 % 43532334 ;
fin:
freeclose(level) ;
#ifdef DEEP_DEBUG
printf ("// magic1=%d, magic2=%d, magic3=%d, magic=%d\n",
magic1, magic2, magic3, magic) ;
#endif
return magic ;
}
/*************************************************************
Open RPC connection to server
INPUT
char *host hostname running server
int timeOut maximum peroid to wait for answer
OUTPUT
return value:
ace_handle * pointer to structure containing open connection
and client identification information
*/
ace_handle *openServer(char *host, u_long rpc_port, int timeOut)
{
struct timeval tv;
char *answer;
int length,
clientId = 0, n,
magic1, magic3 = 0 ;
ace_reponse *reponse = 0;
ace_data question ;
ace_handle *handle;
CLIENT *clnt;
/* open rpc connection */
/* lao: */
clnt = clnt_create (host, RPC_ACE, RPC_ACE_VERS, "tcp");
if (!clnt) return((ace_handle *)NULL);
/* authenticate */
question.clientId = 0;
question.magic = 0;
question.reponse.reponse_len = 0;
question.reponse.reponse_val = "";
question.question = "";
question.aceError = 0;
question.kBytes = 0;
question.encore = 0;
#ifdef JUNK
int first = 1 ;
/* kludge: on first connection to a daemon
the conection is lost, so i try to connect twice,
once with a short timeOut, then the real try
at least on a dec alpha, the first connection keeps hanging and the
inetd daemon keeps restrating the server for ever
the advantage of this kludge is that the first client connection no
longer fails, and it is otherwise harmless since the restarting
server happenned before i introduced this kludge
*/
if (first)
{ first = 0 ;
( run in 0.641 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )