RCSID
("$Header$");
+#include <fcntl.h>
+#include <sys/stat.h>
#ifdef AFS_NT40_ENV
#include <winsock2.h>
-#include <fcntl.h>
#include <WINNT/afsevent.h>
#else
#include <netinet/in.h>
#include <sys/time.h>
#include <netdb.h>
#endif
-
-#ifdef HAVE_STRING_H
#include <string.h>
-#else
-#ifdef HAVE_STRINGS_H
-#include <strings.h>
-#endif
-#endif
-
#include <afs/stds.h>
#include <sys/types.h>
#include <time.h>
#include <rx/rxkad.h>
#include <rx/rx_globals.h>
#include <afs/cellconfig.h>
-#include <afs/auth.h>
#include <afs/bubasics.h>
#include <afs/afsutil.h>
#include <afs/com_err.h>
struct ubik_dbase *BU_dbase;
struct afsconf_dir *BU_conf; /* for getting cell info */
+int argHandler(struct cmd_syndesc *, void *);
+
char lcell[MAXKTCREALMLEN];
afs_int32 myHost = 0;
int helpOption;
/* debugging control */
int debugging = 0;
+int rxBind = 0;
+int lwps = 3;
+
+#define MINLWP 3
+#define MAXLWP 16
+
+#define ADDRSPERSITE 16 /* Same global is in rx/rx_user.c */
+afs_uint32 SHostAddrs[ADDRSPERSITE];
+
+#if defined(AFS_PTHREAD_ENV)
+char *
+threadNum(void)
+{
+ return pthread_getspecific(rx_thread_id_key);
+}
+#endif
+
/* check whether caller is authorized to manage RX statistics */
int
BU_rxstat_userok(call)
* If it were, this routine would never have been called.
*/
static int
-MyBeforeProc(as)
- register struct cmd_syndesc *as;
+MyBeforeProc(register struct cmd_syndesc *as, void *arock)
{
helpOption = 0;
return 0;
* initialize all the supported commands and their arguments
*/
+void
initializeArgHandler()
{
struct cmd_syndesc *cptr;
- int argHandler();
-
cmd_SetBeforeProc(MyBeforeProc, NULL);
cptr = cmd_CreateSyntax(NULL, argHandler, NULL, "Backup database server");
cmd_AddParm(cptr, "-ubikbuffers", CMD_SINGLE, CMD_OPTIONAL,
"the number of ubik buffers");
+ cmd_AddParm(cptr, "-auditlog", CMD_SINGLE, CMD_OPTIONAL,
+ "audit log path");
+
+ cmd_AddParm(cptr, "-p", CMD_SINGLE, CMD_OPTIONAL,
+ "number of processes");
+
+ cmd_AddParm(cptr, "-rxbind", CMD_FLAG, CMD_OPTIONAL,
+ "bind the Rx socket (primary interface only)");
+
}
int
-argHandler(as, arock)
- struct cmd_syndesc *as;
- char *arock;
+argHandler(struct cmd_syndesc *as, void *arock)
{
/* globalConfPtr provides the handle for the configuration information */
else
ubik_nBuffers = 0;
+ if (as->parms[7].items != 0) {
+ int tempfd, flags;
+ FILE *auditout;
+ char oldName[MAXPATHLEN];
+ char *fileName = as->parms[7].items->data;
+#ifndef AFS_NT40_ENV
+ struct stat statbuf;
+
+ if ((lstat(fileName, &statbuf) == 0)
+ && (S_ISFIFO(statbuf.st_mode))) {
+ flags = O_WRONLY | O_NONBLOCK;
+ } else
+#endif
+ {
+ strcpy(oldName, fileName);
+ strcat(oldName, ".old");
+ renamefile(fileName, oldName);
+ flags = O_WRONLY | O_TRUNC | O_CREAT;
+ }
+ tempfd = open(fileName, flags, 0666);
+ if (tempfd > -1) {
+ auditout = fdopen(tempfd, "a");
+ if (auditout) {
+ osi_audit_file(auditout);
+ } else
+ printf("Warning: auditlog %s not writable, ignored.\n", fileName);
+ } else
+ printf("Warning: auditlog %s not writable, ignored.\n", fileName);
+ }
+
+ /* user provided the number of threads */
+ if (as->parms[8].items != 0) {
+ lwps = atoi(as->parms[8].items->data);
+ if (lwps > MAXLWP) {
+ printf ("Warning: '-p %d' is too big; using %d instead\n",
+ lwps, MAXLWP);
+ lwps = MAXLWP;
+ }
+ if (lwps < MINLWP) {
+ printf ("Warning: '-p %d' is too small; using %d instead\n",
+ lwps, MINLWP);
+ lwps = MINLWP;
+ }
+ }
+
+ /* user provided rxbind option */
+ if (as->parms[9].items != 0) {
+ rxBind = 1;
+ }
+
return 0;
}
struct afsconf_cell cellinfo;
time_t currentTime;
afs_int32 code = 0;
+ afs_uint32 host = ntohl(INADDR_ANY);
+
+ char clones[MAXHOSTSPERCELL];
struct rx_service *tservice;
struct rx_securityClass *sca[3];
sigaction(SIGSEGV, &nsa, NULL);
sigaction(SIGABRT, &nsa, NULL);
#endif
+ osi_audit_init();
osi_audit(BUDB_StartEvent, 0, AUD_END);
initialize_BUDB_error_table();
#ifdef AFS_NT40_ENV
ReportErrorEventAlt(AFSEVT_SVR_NO_INSTALL_DIR, 0, argv[0], 0);
#endif
- com_err(whoami, errno, "; Unable to obtain AFS server directory.");
+ afs_com_err(whoami, errno, "; Unable to obtain AFS server directory.");
exit(2);
}
srandom(1);
+#ifdef AFS_PTHREAD_ENV
+ SetLogThreadNumProgram( threadNum );
+#endif
+
/* process the user supplied args */
helpOption = 1;
code = cmd_Dispatch(argc, argv);
BU_conf = afsconf_Open(globalConfPtr->cellConfigdir);
if (BU_conf == 0) {
LogError(code, "Failed getting cell info\n");
- com_err(whoami, code, "Failed getting cell info");
+ afs_com_err(whoami, code, "Failed getting cell info");
ERROR(BUDB_NOCELLS);
}
LogDebug(1, "Using server list from %s cell database.\n", lcell);
- code = afsconf_GetCellInfo(BU_conf, lcell, 0, &cellinfo);
+ code = afsconf_GetExtendedCellInfo (BU_conf, lcell, 0, &cellinfo,
+ &clones);
code =
convert_cell_to_ubik(&cellinfo, &globalConfPtr->myHost,
globalConfPtr->serverList);
rx_SetRxDeadTime(60); /* 60 seconds inactive before timeout */
- code = ubik_ServerInit(globalConfPtr->myHost, htons(AFSCONF_BUDBPORT), globalConfPtr->serverList, dbNamePtr, /* name prefix */
- &BU_dbase);
+ if (rxBind) {
+ afs_int32 ccode;
+ if (AFSDIR_SERVER_NETRESTRICT_FILEPATH ||
+ AFSDIR_SERVER_NETINFO_FILEPATH) {
+ char reason[1024];
+ ccode = parseNetFiles(SHostAddrs, NULL, NULL,
+ ADDRSPERSITE, reason,
+ AFSDIR_SERVER_NETINFO_FILEPATH,
+ AFSDIR_SERVER_NETRESTRICT_FILEPATH);
+ } else
+ {
+ ccode = rx_getAllAddr(SHostAddrs, ADDRSPERSITE);
+ }
+ if (ccode == 1) {
+ host = SHostAddrs[0];
+ rx_InitHost(host, htons(AFSCONF_BUDBPORT));
+ }
+ }
+
+ code = ubik_ServerInitByInfo (globalConfPtr->myHost,
+ htons(AFSCONF_BUDBPORT),
+ &cellinfo,
+ &clones,
+ dbNamePtr, /* name prefix */
+ &BU_dbase);
+
if (code) {
LogError(code, "Ubik init failed\n");
- com_err(whoami, code, "Ubik init failed");
+ afs_com_err(whoami, code, "Ubik init failed");
ERROR(code);
}
rx_SetNoJumbo();
tservice =
- rx_NewService(0, BUDB_SERVICE, "BackupDatabase", sca, 3,
+ rx_NewServiceHost(host, 0, BUDB_SERVICE, "BackupDatabase", sca, 3,
BUDB_ExecuteRequest);
if (tservice == (struct rx_service *)0) {
LogError(0, "Could not create backup database rx service\n");
BUDB_EXIT(3);
}
rx_SetMinProcs(tservice, 1);
- rx_SetMaxProcs(tservice, 3);
+ rx_SetMaxProcs(tservice, lwps);
rx_SetStackSize(tservice, 10000);
/* allow super users to manage RX statistics */
currentTime = time(0);
LogError(0, "Ready to process requests at %s\n", ctime(¤tTime));
- rx_ServerProc(); /* donate this LWP */
+ rx_ServerProc(NULL); /* donate this LWP */
error_exit:
osi_audit(BUDB_FinishEvent, code, AUD_END);
return (code);
}
-
+void
consistencyCheckDb()
{
/* do consistency checks on structure sizes */
static char timestamp[20];
lt = localtime(&t);
- strftime(timestamp, 20, "%m/%d/%Y %T", lt);
+ strftime(timestamp, 20, "%m/%d/%Y %H:%M:%S", lt);
return timestamp;
}
fprintf(globalConfPtr->log, "%s ", TimeStamp(now));
if (code)
- fprintf(globalConfPtr->log, "%s: %s\n", error_table_name(code),
- error_message(code));
+ fprintf(globalConfPtr->log, "%s: %s\n", afs_error_table_name(code),
+ afs_error_message(code));
fprintf(globalConfPtr->log, a, b, c, d, e, f, g, h, i);
fflush(globalConfPtr->log);
fclose(globalConfPtr->log);