# Europagate, 1995
#
# $Log: Makefile,v $
-# Revision 1.16 1995/11/10 10:19:48 adam
+# Revision 1.17 1995/12/20 16:28:07 adam
+# Extra parameter block to gw_db_open. If block is 0 gw_db_open
+# returns NULL if lock couldn't be satisfied.
+# Minor changes in iso2709.c.
+#
+# Revision 1.16 1995/11/10 10:19:48 adam
# Test programs not build on 'make all'.
#
# Revision 1.15 1995/05/01 12:43:55 adam
PO=iso2709.o iso27dis.o iso2709o.o iso2709a.o strqueue.o \
gw-db.o gip.o gips.o gipc.o ttyemit.o lgets.o
CPP=$(CC) -E
-DEFS=$(INCLUDE) -DSTUPID_ISO_DBC=1
+DEFS=$(INCLUDE) -DWEIRD_ISO_DBC=1
all: $(TPROG1)
$(TPROG1): $(TPROG1).o $(LIB)
- $(CC) $(CFLAGS) -o $(TPROG1) $(TPROG1).o $(LIB)
+ $(CC) $(CFLAGS) -o $(TPROG1) $(TPROG1).o $(LIB) ../lib/libres+log.a
$(TPROG2): $(TPROG2).o $(LIB)
- $(CC) $(CFLAGS) -o $(TPROG2) $(TPROG2).o $(LIB)
+ $(CC) $(CFLAGS) -o $(TPROG2) $(TPROG2).o $(LIB) ../lib/libres+log.a
$(LIB): $(PO)
rm -f $(LIB)
* Europagate, 1995
*
* $Log: gw-db.c,v $
- * Revision 1.3 1995/05/16 09:40:53 adam
+ * Revision 1.4 1995/12/20 16:28:07 adam
+ * Extra parameter block to gw_db_open. If block is 0 gw_db_open
+ * returns NULL if lock couldn't be satisfied.
+ * Minor changes in iso2709.c.
+ *
+ * Revision 1.3 1995/05/16 09:40:53 adam
* LICENSE.
*
* Revision 1.2 1995/05/01 12:43:57 adam
#include <unistd.h>
#include <fcntl.h>
+#include <gw-log.h>
#include <gw-db.h>
#define FILE_HEAD_LEN 128
int prev; /* prev in hach chain - possibly 0 */
};
+static char *mod = "gwdb";
+
/*
* write_head: write header of table
*/
/*
* lock_file: lock entire file
*/
-static void lock_file (int fd, int type)
+static int lock_file (int fd, int block, int type)
{
struct flock area;
area.l_type = type;
area.l_whence = SEEK_SET;
area.l_start = 0L;
area.l_len = 0L;
- fcntl (fd, F_SETLKW, &area);
+ return fcntl (fd, block ? F_SETLKW : F_SETLK, &area);
}
+
/*
* gw_db_lookup: table lookup
*/
/*
* gw_db_open: open and lock table for reading (and writing)
*/
-GW_DB gw_db_open (const char *fname, int write_flag)
+GW_DB gw_db_open (const char *fname, int write_flag, int block)
{
char file_head_buf[FILE_HEAD_LEN];
GW_DB db;
int r;
- if (!(db = malloc (sizeof(*db))))
- return NULL;
+ db = malloc (sizeof(*db));
+ if (!db)
+ {
+ gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "malloc");
+ exit (1);
+ }
db->dirty = 0;
if (!(db->hash_array = malloc (DB_HASH * sizeof(*db->hash_array))))
- return gw_db_free (db);
+ {
+ gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "malloc");
+ exit (1);
+ }
if (write_flag)
- db->fd = open (fname, O_RDWR|O_CREAT, 0666);
+ {
+ if ((db->fd = open (fname, O_RDWR|O_CREAT, 0666)) == -1)
+ {
+ gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "open %s", fname);
+ exit (1);
+ }
+ }
else
- db->fd = open (fname, O_RDONLY);
- if (db->fd == -1)
- return gw_db_free (db);
- lock_file (db->fd, write_flag ? F_WRLCK : F_RDLCK);
+ {
+ if ((db->fd = open (fname, O_RDONLY)) == -1)
+ {
+ gw_log (GW_LOG_WARN|GW_LOG_ERRNO," open %s", fname);
+ return gw_db_free (db);
+ }
+ }
+ if (block)
+ lock_file (db->fd, 1, write_flag ? F_WRLCK : F_RDLCK);
+ else
+ {
+ r = lock_file (db->fd, 0, write_flag ? F_WRLCK : F_RDLCK);
+ if (r == -1)
+ {
+ gw_log (GW_LOG_WARN|GW_LOG_ERRNO, "flock %s", fname);
+ close (db->fd);
+ return gw_db_free (db);
+ }
+ }
r = read (db->fd, file_head_buf, FILE_HEAD_LEN);
if (r == -1)
return gw_db_free (db);
if (db->dirty)
r = write_head (db);
- lock_file (db->fd, F_UNLCK);
+ lock_file (db->fd, 1, F_UNLCK);
if (close (db->fd) == -1)
{
gw_db_free (db);
* Europagate, 1995
*
* $Log: gwdbtest.c,v $
- * Revision 1.2 1995/05/16 09:40:53 adam
+ * Revision 1.3 1995/12/20 16:28:08 adam
+ * Extra parameter block to gw_db_open. If block is 0 gw_db_open
+ * returns NULL if lock couldn't be satisfied.
+ * Minor changes in iso2709.c.
+ *
+ * Revision 1.2 1995/05/16 09:40:53 adam
* LICENSE.
*
* Revision 1.1 1995/03/27 08:25:02 adam
int r;
int no_insert = 0;
- gwdb = gw_db_open ("db.test", 1);
+ gwdb = gw_db_open ("db.test", 1, 1);
for (no = 0; scanf ("%s", word) == 1; no++)
{
r = gw_db_lookup (gwdb, word, strlen(word), & buf, &count);