/*
* Copyright 2000, International Business Machines Corporation and others.
* All Rights Reserved.
- *
+ *
* This software has been released under the terms of the IBM Public
* License. For details, see the LICENSE file in the top-level source
* directory or online at http://www.openafs.org/dl/license10.html
#include <stdarg.h>
-/* these are now appended by the error table compiler */
-#if 0
-/* ubik error codes */
-#define UMINCODE 100000 /* lowest ubik error code */
-#define UNOQUORUM 100000 /* no quorum elected */
-#define UNOTSYNC 100001 /* not synchronization site (should work on sync site) */
-#define UNHOSTS 100002 /* too many hosts */
-#define UIOERROR 100003 /* I/O error writing dbase or log */
-#define UINTERNAL 100004 /* mysterious internal error */
-#define USYNC 100005 /* major synchronization error */
-#define UNOENT 100006 /* file not found when processing dbase */
-#define UBADLOCK 100007 /* bad lock range size (must be 1) */
-#define UBADLOG 100008 /* read error reprocessing log */
-#define UBADHOST 100009 /* problems with host name */
-#define UBADTYPE 100010 /* bad operation for this transaction type */
-#define UTWOENDS 100011 /* two commits or aborts done to transaction */
-#define UDONE 100012 /* operation done after abort (or commmit) */
-#define UNOSERVERS 100013 /* no servers appear to be up */
-#define UEOF 100014 /* premature EOF */
-#define ULOGIO 100015 /* error writing log file */
-#define UMAXCODE 100100 /* largest ubik error code */
-
-#endif
-
#include <ubik_int.h>
/*! \name ubik_trans types */
/*! \name ubik_lock types */
#define LOCKREAD 1
#define LOCKWRITE 2
-#if !defined(UBIK_PAUSE)
#define LOCKWAIT 3
-#endif /* UBIK_PAUSE */
/*\}*/
/*! \name ubik client flags */
#ifdef AFS_PTHREAD_ENV
#include <pthread.h>
-#include <assert.h>
#else
#include <lwp.h>
#endif
+/*! Sanity check: This macro represents an arbitrary date in the past
+ * (Tue Jun 20 15:36:43 2017). The database epoch must be greater or
+ * equal to this value. */
+#define UBIK_MILESTONE 1497987403
+
/*!
* \brief per-client structure for ubik
*/
};
#ifdef AFS_PTHREAD_ENV
-#define LOCK_UBIK_CLIENT(client) assert(pthread_mutex_lock(&client->cm)==0)
-#define UNLOCK_UBIK_CLIENT(client) assert(pthread_mutex_unlock(&client->cm)==0)
+#define LOCK_UBIK_CLIENT(client) opr_mutex_enter(&client->cm)
+#define UNLOCK_UBIK_CLIENT(client) opr_mutex_exit(&client->cm)
#else
#define LOCK_UBIK_CLIENT(client)
#define UNLOCK_UBIK_CLIENT(client)
struct ubik_stat {
afs_int32 size;
- afs_int32 mtime;
};
-#if defined(UKERNEL)
-#include "afs/lock.h"
-#else /* defined(UKERNEL) */
#include <lock.h> /* just to make sure we've got this */
-#endif /* defined(UKERNEL) */
/*!
* \brief representation of a ubik database.
*
- * Contains info on low-level disk access routines
+ * Contains info on low-level disk access routines
* for use by disk transaction module.
*/
struct ubik_dbase {
struct ubik_version version; /*!< version number */
#ifdef AFS_PTHREAD_ENV
pthread_mutex_t versionLock; /*!< lock on version number */
-#elif defined(UKERNEL)
- struct afs_lock versionLock; /*!< lock on version number */
-#else /* defined(UKERNEL) */
+#else
struct Lock versionLock; /*!< lock on version number */
-#endif /* defined(UKERNEL) */
+#endif
afs_int32 tidCounter; /*!< last RW or RO trans tid counter */
afs_int32 writeTidCounter; /*!< last write trans tid counter */
afs_int32 flags; /*!< flags */
int (*setlabel) (struct ubik_dbase * adbase, afs_int32 afile, struct ubik_version * aversion); /*!< set the version label */
int (*getlabel) (struct ubik_dbase * adbase, afs_int32 afile, struct ubik_version * aversion); /*!< retrieve the version label */
int (*getnfiles) (struct ubik_dbase * adbase); /*!< find out number of files */
+ int (*buffered_append)(struct ubik_dbase *adbase, afs_int32 afid, void *adata, afs_int32 alength);
short readers; /*!< number of current read transactions */
struct ubik_version cachedVersion; /*!< version of caller's cached data */
-#ifdef UKERNEL
- struct afs_lock cache_lock;
-#else
struct Lock cache_lock; /*!< protects cached application data */
-#endif
#ifdef AFS_PTHREAD_ENV
- pthread_cond_t version_cond; /*!< condition variable to manage changes to version */
pthread_cond_t flags_cond; /*!< condition variable to manage changes to flags */
#endif
};
extern void *ubik_SRXSecurityRock;
extern int (*ubik_CheckRXSecurityProc) (void *, struct rx_call *);
extern void *ubik_CheckRXSecurityRock;
+
+extern void ubik_SetClientSecurityProcs(int (*scproc)(void *,
+ struct rx_securityClass **,
+ afs_int32 *),
+ int (*checkproc) (void *),
+ void *rock);
+extern void ubik_SetServerSecurityProcs
+ (void (*buildproc) (void *,
+ struct rx_securityClass ***,
+ afs_int32 *),
+ int (*checkproc) (void *, struct rx_call *),
+ void *rock);
+
/*\}*/
+/*
+ * For applications that make use of ubik_BeginTransReadAnyWrite, writing
+ * processes must not update the application-level cache as they write,
+ * or else readers can read the new cache before the data is committed to
+ * the db. So, when a commit occurs, the cache must be updated right then.
+ * If set, this function will be called during commits of write transactions,
+ * to update the application-level cache after a write. This will be called
+ * immediately after the local disk commit succeeds, and it will be called
+ * with a lock held that prevents other threads from reading from the cache
+ * or the db in general.
+ *
+ * Note that this function MUST be set in order to make use of
+ * ubik_BeginTransReadAnyWrite.
+ */
+extern int (*ubik_SyncWriterCacheProc) (void);
+
/****************INTERNALS BELOW ****************/
#ifdef UBIK_INTERNALS
/*! \name ubik_dbase flags */
#define DBWRITING 1 /*!< are any write trans. in progress */
-#if defined(UBIK_PAUSE)
-#define DBVOTING 2 /*!< the beacon task is polling */
-#endif /* UBIK_PAUSE */
/*\}*/
/*!\name ubik trans flags */
#define TRDONE 1 /*!< commit or abort done */
#define TRABORT 2 /*!< if #TRDONE, tells if aborted */
#define TRREADANY 4 /*!< read any data available in trans */
-#if defined(UBIK_PAUSE)
-#define TRSETLOCK 8 /*!< SetLock is using trans */
-#define TRSTALE 16 /*!< udisk_end during getLock */
-#endif /* UBIK_PAUSE */
#define TRCACHELOCKED 32 /*!< this trans has locked dbase->cache_lock
* (meaning, this trans has called
* ubik_CheckCache at some point */
+#define TRREADWRITE 64 /*!< read even if there's a conflicting ubik-
+ * level write lock */
/*\}*/
/*! \name ubik_lock flags */
/*!
* \name timer constants
- * time constant for replication algorithms: the R time period is 20 seconds. Both
+ * time constant for replication algorithms: the R time period is 20 seconds. Both
* #SMALLTIME and #BIGTIME must be larger than #RPCTIMEOUT+max(#RPCTIMEOUT, #POLLTIME),
* so that timeouts do not prevent us from getting through to our servers in time.
*
/*! \name hold and release functions on a database */
#ifdef AFS_PTHREAD_ENV
-# define DBHOLD(a) assert(pthread_mutex_lock(&((a)->versionLock)) == 0)
-# define DBRELE(a) assert(pthread_mutex_unlock(&((a)->versionLock)) == 0)
+# define DBHOLD(a) opr_mutex_enter(&((a)->versionLock))
+# define DBRELE(a) opr_mutex_exit(&((a)->versionLock))
#else /* !AFS_PTHREAD_ENV */
# define DBHOLD(a) ObtainWriteLock(&((a)->versionLock))
# define DBRELE(a) ReleaseWriteLock(&((a)->versionLock))
extern struct ubik_stats { /* random stats */
afs_int32 escapes;
} ubik_stats;
-extern afs_int32 ubik_epochTime; /* time when this site started */
extern afs_int32 urecovery_state; /* sync site recovery process state */
extern struct ubik_trans *ubik_currentTrans; /* current trans */
-extern struct ubik_version ubik_dbVersion; /* sync site's dbase version */
extern afs_int32 ubik_debugFlag; /* ubik debug flag */
extern int ubikPrimaryAddrOnly; /* use only primary address */
-/* this extern gives the sync site's db version, with epoch of 0 if none yet */
+/*
+ * Lock ordering
+ *
+ * Any of the locks may be acquired singly; when acquiring multiple locks, they
+ * should be acquired in the listed order:
+ * application cache lock (dbase->cache_lock)
+ * database lock DBHOLD/DBRELE
+ * beacon lock UBIK_BEACON_LOCK/UNLOCK
+ * vote lock UBIK_VOTE_LOCK/UNLOCK
+ * version lock UBIK_VERSION_LOCK/UNLOCK
+ * server address lock UBIK_ADDR_LOCK/UNLOCK
+ */
+
+/*!
+ * \brief Global beacon data. All values are protected by beacon_lock
+ * This lock also protects some values in the ubik_server structures:
+ * lastVoteTime
+ * lastBeaconSent
+ * lastVote
+ * up
+ * beaconSinceDown
+ */
+struct beacon_data {
+#ifdef AFS_PTHREAD_ENV
+ pthread_mutex_t beacon_lock;
+#endif
+ int ubik_amSyncSite; /*!< flag telling if I'm sync site */
+ afs_int32 syncSiteUntil; /*!< valid only if amSyncSite */
+ int ubik_syncSiteAdvertised; /*!< flag telling if remotes are aware we have quorum */
+};
+
+#define UBIK_BEACON_LOCK opr_mutex_enter(&beacon_globals.beacon_lock)
+#define UBIK_BEACON_UNLOCK opr_mutex_exit(&beacon_globals.beacon_lock)
+
+/*!
+ * \brief Global vote data. All values are protected by vote_lock
+ */
+struct vote_data {
+#ifdef AFS_PTHREAD_ENV
+ pthread_mutex_t vote_lock;
+#endif
+ struct ubik_version ubik_dbVersion; /* sync site's dbase version */
+ struct ubik_tid ubik_dbTid; /* sync site's tid, or 0 if none */
+ /* Used by all sites in nominating new sync sites */
+ afs_int32 ubik_lastYesTime; /* time we sent the last yes vote */
+ afs_uint32 lastYesHost; /* host to which we sent yes vote */
+ /* Next is time sync site began this vote: guarantees sync site until this + SMALLTIME */
+ afs_int32 lastYesClaim;
+ int lastYesState; /* did last site we voted for claim to be sync site? */
+ /* Used to guarantee that nomination process doesn't loop */
+ afs_int32 lowestTime;
+ afs_uint32 lowestHost;
+ afs_int32 syncTime;
+ afs_int32 syncHost;
+};
+
+#define UBIK_VOTE_LOCK opr_mutex_enter(&vote_globals.vote_lock)
+#define UBIK_VOTE_UNLOCK opr_mutex_exit(&vote_globals.vote_lock)
+
+/*!
+ * \brief Server address data. All values are protected by addr_lock
+ *
+ * This lock also protects:
+ * ubik_server: addr[], vote_rxcid, disk_rxcid
+ *
+ */
+struct addr_data {
+#ifdef AFS_PTHREAD_ENV
+ pthread_mutex_t addr_lock;
+#endif
+ afs_int32 ubikSecIndex;
+ struct rx_securityClass *ubikSecClass;
+};
+
+#define UBIK_ADDR_LOCK opr_mutex_enter(&addr_globals.addr_lock)
+#define UBIK_ADDR_UNLOCK opr_mutex_exit(&addr_globals.addr_lock)
+
+/*!
+ * \brief The version lock protects the structure member, as well as
+ * the database version, flags, tidCounter, writeTidCounter
+ */
+struct version_data {
+#ifdef AFS_PTHREAD_ENV
+ pthread_mutex_t version_lock;
+#endif
+ afs_int32 ubik_epochTime; /* time when this site started */
+};
+
+#define UBIK_VERSION_LOCK opr_mutex_enter(&version_globals.version_lock)
+#define UBIK_VERSION_UNLOCK opr_mutex_exit(&version_globals.version_lock)
/* phys.c */
-extern int uphys_close(register int afd);
extern int uphys_stat(struct ubik_dbase *adbase, afs_int32 afid,
struct ubik_stat *astat);
-extern int uphys_read(register struct ubik_dbase *adbase, afs_int32 afile,
- register void *abuffer, afs_int32 apos,
+extern int uphys_read(struct ubik_dbase *adbase, afs_int32 afile,
+ void *abuffer, afs_int32 apos,
afs_int32 alength);
-extern int uphys_write(register struct ubik_dbase *adbase, afs_int32 afile,
- register void *abuffer, afs_int32 apos,
+extern int uphys_write(struct ubik_dbase *adbase, afs_int32 afile,
+ void *abuffer, afs_int32 apos,
afs_int32 alength);
-extern int uphys_truncate(register struct ubik_dbase *adbase, afs_int32 afile,
+extern int uphys_truncate(struct ubik_dbase *adbase, afs_int32 afile,
afs_int32 asize);
-extern int uphys_getnfiles(register struct ubik_dbase *adbase);
-extern int uphys_getlabel(register struct ubik_dbase *adbase, afs_int32 afile,
+extern int uphys_getnfiles(struct ubik_dbase *adbase);
+extern int uphys_getlabel(struct ubik_dbase *adbase, afs_int32 afile,
struct ubik_version *aversion);
-extern int uphys_setlabel(register struct ubik_dbase *adbase, afs_int32 afile,
+extern int uphys_setlabel(struct ubik_dbase *adbase, afs_int32 afile,
struct ubik_version *aversion);
-extern int uphys_sync(register struct ubik_dbase *adbase, afs_int32 afile);
-extern void uphys_invalidate(register struct ubik_dbase *adbase,
+extern int uphys_sync(struct ubik_dbase *adbase, afs_int32 afile);
+extern void uphys_invalidate(struct ubik_dbase *adbase,
afs_int32 afid);
+extern int uphys_buf_append(struct ubik_dbase *adbase, afs_int32 afid,
+ void *buf, afs_int32 alength);
/*! \name recovery.c */
extern int urecovery_ResetState(void);
-extern int urecovery_LostServer(void);
-extern int urecovery_AllBetter(register struct ubik_dbase *adbase,
+extern int urecovery_LostServer(struct ubik_server *server);
+extern int urecovery_AllBetter(struct ubik_dbase *adbase,
int areadAny);
extern int urecovery_AbortAll(struct ubik_dbase *adbase);
-extern int urecovery_CheckTid(register struct ubik_tid *atid);
-extern int urecovery_Initialize(register struct ubik_dbase *adbase);
+extern int urecovery_CheckTid(struct ubik_tid *atid, int abortalways);
+extern int urecovery_Initialize(struct ubik_dbase *adbase);
extern void *urecovery_Interact(void *);
extern int DoProbe(struct ubik_server *server);
/*\}*/
/*! \name ubik.c */
-extern afs_int32 ContactQuorum_NoArguments(afs_int32 (*proc)
- (struct rx_connection *,
- ubik_tid *),
- struct ubik_trans *atrans,
- int aflags);
-
-extern afs_int32 ContactQuorum_DISK_Lock(struct ubik_trans *atrans,
- int aflags,
- afs_int32 file, afs_int32 position,
- afs_int32 length, afs_int32 type);
-
-extern afs_int32 ContactQuorum_DISK_Write(struct ubik_trans *atrans,
- int aflags,
- afs_int32 file, afs_int32 position,
- bulkdata *data);
-
-extern afs_int32 ContactQuorum_DISK_Truncate(struct ubik_trans *atrans,
- int aflags,
- afs_int32 file, afs_int32 length);
-
-extern afs_int32 ContactQuorum_DISK_WriteV(struct ubik_trans *atrans,
- int aflags,
- iovec_wrt * io_vector,
- iovec_buf *io_buffer);
-
-extern afs_int32 ContactQuorum_DISK_SetVersion(struct ubik_trans *atrans,
+extern afs_int32 ContactQuorum_DISK_SetVersion(struct ubik_trans *atrans,
int aflags,
ubik_version *OldVersion,
ubik_version *NewVersion);
-
+
extern void panic(char *format, ...)
AFS_ATTRIBUTE_FORMAT(__printf__, 1, 2);
-extern afs_uint32 ubikGetPrimaryInterfaceAddr(afs_uint32 addr);
+extern afs_uint32 ubikGetPrimaryInterfaceAddr(afs_uint32 addr);
+
+extern int ubik_CheckAuth(struct rx_call *);
+
/*\}*/
/*! \name beacon.c */
struct afsconf_cell;
+extern void ubeacon_InitSecurityClass(void);
+extern void ubeacon_ReinitServer(struct ubik_server *ts);
extern void ubeacon_Debug(struct ubik_debug *aparm);
extern int ubeacon_AmSyncSite(void);
-extern int ubeacon_InitServerListByInfo(afs_int32 ame,
- struct afsconf_cell *info,
+extern int ubeacon_SyncSiteAdvertised(void);
+extern int ubeacon_InitServerListByInfo(afs_uint32 ame,
+ struct afsconf_cell *info,
char clones[]);
-extern int ubeacon_InitServerList(afs_int32 ame, afs_int32 aservers[]);
+extern int ubeacon_InitServerList(afs_uint32 ame, afs_uint32 aservers[]);
extern void *ubeacon_Interact(void *);
+extern int ubeacon_updateUbikNetworkAddress(afs_uint32 ubik_host[]);
+extern struct beacon_data beacon_globals;
+extern struct addr_data addr_globals;
+
/*\}*/
/*! \name disk.c */
+extern int udisk_Init(int nBUffers);
extern void udisk_Debug(struct ubik_debug *aparm);
extern int udisk_Invalidate(struct ubik_dbase *adbase, afs_int32 afid);
-extern int udisk_read(struct ubik_trans *atrans, afs_int32 afile,
+extern int udisk_read(struct ubik_trans *atrans, afs_int32 afile,
void *abuffer, afs_int32 apos, afs_int32 alen);
-extern int udisk_truncate(struct ubik_trans *atrans, afs_int32 afile,
+extern int udisk_truncate(struct ubik_trans *atrans, afs_int32 afile,
afs_int32 alength);
-extern int udisk_write(struct ubik_trans *atrans, afs_int32 afile,
+extern int udisk_write(struct ubik_trans *atrans, afs_int32 afile,
void *abuffer, afs_int32 apos, afs_int32 alen);
-extern int udisk_begin(struct ubik_dbase *adbase, int atype,
+extern int udisk_begin(struct ubik_dbase *adbase, int atype,
struct ubik_trans **atrans);
extern int udisk_commit(struct ubik_trans *atrans);
extern int udisk_abort(struct ubik_trans *atrans);
/*\}*/
/*! \name lock.c */
+extern void ulock_Init(void);
extern int ulock_getLock(struct ubik_trans *atrans, int atype, int await);
extern void ulock_relLock(struct ubik_trans *atrans);
extern void ulock_Debug(struct ubik_debug *aparm);
extern int uvote_ShouldIRun(void);
extern afs_int32 uvote_GetSyncSite(void);
extern int uvote_Init(void);
-extern void ubik_vprint(const char *format, va_list ap)
- AFS_ATTRIBUTE_FORMAT(__printf__, 1, 0);
-
-extern void ubik_print(const char *format, ...)
- AFS_ATTRIBUTE_FORMAT(__printf__, 1, 2);
-
-extern void ubik_dprint(const char *format, ...)
- AFS_ATTRIBUTE_FORMAT(__printf__, 1, 2);
-
-extern void ubik_dprint_25(const char *format, ...)
- AFS_ATTRIBUTE_FORMAT(__printf__, 1, 2);
+extern struct vote_data vote_globals;
+extern void uvote_set_dbVersion(struct ubik_version);
+extern int uvote_eq_dbVersion(struct ubik_version);
+extern int uvote_HaveSyncAndVersion(struct ubik_version);
/*\}*/
#endif /* UBIK_INTERNALS */
/*! \name ubik.c */
struct afsconf_cell;
-extern int ubik_ServerInitByInfo(afs_int32 myHost, short myPort,
+extern int ubik_ServerInitByInfo(afs_uint32 myHost, short myPort,
struct afsconf_cell *info, char clones[],
const char *pathName,
struct ubik_dbase **dbase);
-extern int ubik_ServerInit(afs_int32 myHost, short myPort,
- afs_int32 serverList[],
+extern int ubik_ServerInit(afs_uint32 myHost, short myPort,
+ afs_uint32 serverList[],
const char *pathName, struct ubik_dbase **dbase);
-extern int ubik_BeginTrans(register struct ubik_dbase *dbase,
+extern int ubik_BeginTrans(struct ubik_dbase *dbase,
afs_int32 transMode, struct ubik_trans **transPtr);
-extern int ubik_BeginTransReadAny(register struct ubik_dbase *dbase,
+extern int ubik_BeginTransReadAny(struct ubik_dbase *dbase,
afs_int32 transMode,
struct ubik_trans **transPtr);
-extern int ubik_AbortTrans(register struct ubik_trans *transPtr);
+extern int ubik_BeginTransReadAnyWrite(struct ubik_dbase *dbase,
+ afs_int32 transMode,
+ struct ubik_trans **transPtr);
+extern int ubik_AbortTrans(struct ubik_trans *transPtr);
-extern int ubik_EndTrans(register struct ubik_trans *transPtr);
-extern int ubik_Read(register struct ubik_trans *transPtr, void *buffer,
+extern int ubik_EndTrans(struct ubik_trans *transPtr);
+extern int ubik_Read(struct ubik_trans *transPtr, void *buffer,
afs_int32 length);
extern int ubik_Flush(struct ubik_trans *transPtr);
-extern int ubik_Write(register struct ubik_trans *transPtr, void *buffer,
- afs_int32 length);
-extern int ubik_Seek(register struct ubik_trans *transPtr, afs_int32 fileid,
+extern int ubik_Write(struct ubik_trans *transPtr, void *buffer,
+ afs_int32 length);
+extern int ubik_Seek(struct ubik_trans *transPtr, afs_int32 fileid,
afs_int32 position);
-extern int ubik_Tell(register struct ubik_trans *transPtr, afs_int32 * fileid,
+extern int ubik_Tell(struct ubik_trans *transPtr, afs_int32 * fileid,
afs_int32 * position);
-extern int ubik_Truncate(register struct ubik_trans *transPtr,
+extern int ubik_Truncate(struct ubik_trans *transPtr,
afs_int32 length);
-extern int ubik_SetLock(struct ubik_trans *atrans, afs_int32 apos,
+extern int ubik_SetLock(struct ubik_trans *atrans, afs_int32 apos,
afs_int32 alen, int atype);
-extern int ubik_WaitVersion(register struct ubik_dbase *adatabase,
- register struct ubik_version *aversion);
-extern int ubik_GetVersion(register struct ubik_trans *atrans,
- register struct ubik_version *avers);
extern int ubik_CheckCache(struct ubik_trans *atrans,
ubik_updatecache_func check,
void *rock);
+extern struct version_data version_globals;
/*\}*/
/*! \name ubikclient.c */
-extern int ubik_ParseClientList(int argc, char **argv, afs_int32 * aothers);
+extern int ubik_ParseClientList(int argc, char **argv, afs_uint32 * aothers);
extern unsigned int afs_random(void);
-extern int ubik_ClientInit(register struct rx_connection **serverconns,
+extern int ubik_ClientInit(struct rx_connection **serverconns,
struct ubik_client **aclient);
extern afs_int32 ubik_ClientDestroy(struct ubik_client *aclient);
extern struct rx_connection *ubik_RefreshConn(struct rx_connection *tc);
long p3, long p4, long p5, long p6, long p7,
long p8, long p9, long p10, long p11, long p12,
long p13, long p14, long p15, long p16);
-extern afs_int32 ubik_Call_New(int (*aproc) (), register struct ubik_client
+extern afs_int32 ubik_Call_New(int (*aproc) (), struct ubik_client
*aclient, afs_int32 aflags, long p1, long p2,
long p3, long p4, long p5, long p6, long p7,
long p8, long p9, long p10, long p11, long p12,
/*\}*/
/* \name ubikcmd.c */
-extern int ubik_ParseServerList(int argc, char **argv, afs_int32 *ahost,
- afs_int32 *aothers);
+extern int ubik_ParseServerList(int argc, char **argv, afs_uint32 *ahost,
+ afs_uint32 *aothers);
/*\}*/
/* \name uinit.c */
struct rx_securityClass;
+struct afsconf_dir;
+typedef int (*ugen_secproc_func)(struct rx_securityClass *, afs_int32);
+extern int ugen_ClientInitCell(struct afsconf_dir *dir,
+ struct afsconf_cell *info,
+ int secFlags,
+ struct ubik_client **uclientp,
+ int maxservers, const char *serviceid,
+ int deadtime);
+extern int ugen_ClientInitServer(const char *confDir, char *cellName,
+ int secFlags, struct ubik_client **uclientp,
+ int maxservers, char *serviceid,
+ int deadtime, afs_uint32 server,
+ afs_uint32 port);
+extern int ugen_ClientInitFlags(const char *confDir, char *cellName,
+ int secFlags, struct ubik_client **uclientp,
+ ugen_secproc_func secproc,
+ int maxservers, char *serviceid,
+ int deadtime);
extern afs_int32 ugen_ClientInit(int noAuthFlag, const char *confDir,
char *cellName, afs_int32 sauth,
struct ubik_client **uclientp,
- int (*secproc) (struct rx_securityClass *sc,
- afs_int32 scIndex),
- char *funcName,
- afs_int32 gen_rxkad_level,
- afs_int32 maxservers, char *serviceid,
- afs_int32 deadtime, afs_uint32 server,
+ ugen_secproc_func secproc,
+ char *funcName,
+ afs_int32 gen_rxkad_level,
+ afs_int32 maxservers, char *serviceid,
+ afs_int32 deadtime, afs_uint32 server,
afs_uint32 port, afs_int32 usrvid);
#endif /* UBIK_H */