-/* $Id: zserver.c,v 1.105 2003-05-20 12:52:50 adam Exp $
- Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
+/* $Id: zserver.c,v 1.109 2003-07-02 22:00:06 adam Exp $
+ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003
Index Data Aps
This file is part of the Zebra server.
02111-1307, USA.
*/
-
-
#include <stdio.h>
#include <assert.h>
#include <fcntl.h>
#ifdef WIN32
#include <io.h>
#include <process.h>
+#include <sys/locking.h>
#else
#include <unistd.h>
#endif
+#include <errno.h>
#include <yaz/log.h>
#include <yaz/ill.h>
#include <yaz/yaz-util.h>
+#include <sys/types.h>
+
#include "zserver.h"
static int bend_sort (void *handle, bend_sort_rr *rr);
switch (r->query->which)
{
case Z_Query_type_1: case Z_Query_type_101:
- zebra_search_rpn (zh, r->decode, r->stream, r->query->u.type_1,
+ zebra_search_RPN (zh, r->stream, r->query->u.type_1,
r->setname, &r->hits);
zebra_result (zh, &r->errcode, &r->errstring);
if (!r->errcode)
break;
case Z_ESAdminOriginPartToKeep_drop:
yaz_log(LOG_LOG, "adm-drop");
+ zebra_drop_database (zh, r->toKeep->databaseName);
break;
case Z_ESAdminOriginPartToKeep_create:
yaz_log(LOG_LOG, "adm-create %s", r->toKeep->databaseName);
static void bend_start (struct statserv_options_block *sob)
{
+ if (sob->handle)
+ zebra_stop((ZebraService) sob->handle);
+ sob->handle = zebra_start(sob->configname);
+ if (!sob->handle)
+ {
+ yaz_log (LOG_FATAL, "Failed to read config `%s'", sob->configname);
+ exit (1);
+ }
#ifdef WIN32
#else
if (!sob->inetd)
{
+ struct flock area;
char *pidfile = "zebrasrv.pid";
- int fd = creat (pidfile, 0666);
+ int fd = open (pidfile, O_EXCL|O_WRONLY|O_CREAT, 0666);
if (fd == -1)
- yaz_log (LOG_WARN|LOG_ERRNO, "creat %s", pidfile);
+ {
+ if (errno != EEXIST)
+ {
+ yaz_log(LOG_FATAL|LOG_ERRNO, "lock file %s", pidfile);
+ exit(1);
+ }
+ fd = open(pidfile, O_RDWR, 0666);
+ if (fd == -1)
+ {
+ yaz_log(LOG_FATAL|LOG_ERRNO, "lock file %s", pidfile);
+ exit(1);
+ }
+ }
+ area.l_type = F_WRLCK;
+ area.l_whence = SEEK_SET;
+ area.l_len = area.l_start = 0L;
+ if (fcntl (fd, F_SETLK, &area) == -1)
+ {
+ yaz_log(LOG_ERRNO|LOG_FATAL, "Zebra server already running");
+ exit(1);
+ }
else
{
char pidstr[30];
sprintf (pidstr, "%ld", (long) getpid ());
write (fd, pidstr, strlen(pidstr));
- close (fd);
}
}
#endif
- if (sob->handle)
- zebra_stop((ZebraService) sob->handle);
- sob->handle = zebra_start(sob->configname);
- if (!sob->handle)
- {
- yaz_log (LOG_FATAL, "Failed to read config `%s'", sob->configname);
- exit (1);
- }
}
static void bend_stop(struct statserv_options_block *sob)