$NetBSD: patch-ag,v 1.2 2010/02/14 22:07:38 dholland Exp $

--- jisyo-tools/skkdic-expr.c.orig	1996-12-17 05:51:28.000000000 +0000
+++ jisyo-tools/skkdic-expr.c
@@ -22,6 +22,8 @@ the Free Software Foundation, 675 Mass A
  */
 
 #include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #include <ndbm.h>
 #include <errno.h>
 #include <signal.h>
@@ -78,59 +80,86 @@ static void db_remove_file(fname)
 	}
 }
 
+#if !defined(dbm_pagfno) || defined(DBM_SUFFIX)
+#define NEW_DB
+#endif
+
 /* ѥǡ١ե
    file_name ˤ content Ǽ */
 static void db_remove_files()
 {
-    char pag_name[256];
-    char dir_name[256];
+    char db_name[256];
 
     db_remove_file(file_name);
-    sprintf(pag_name, "%s.pag", file_name);
-    db_remove_file(pag_name);
-    sprintf(dir_name, "%s.dir", file_name);
-    db_remove_file(dir_name);
+#ifdef NEW_DB
+    sprintf(db_name, "%s.db", file_name);
+    db_remove_file(db_name);
+#else
+    sprintf(db_name, "%s.pag", file_name);
+    db_remove_file(db_name);
+    sprintf(db_name, "%s.dir", file_name);
+    db_remove_file(db_name);
+#endif
 
     if (okurigana_flag) {
 	db_remove_file(okuri_head_name);
-	sprintf(pag_name, "%s.pag", okuri_head_name);
-	db_remove_file(pag_name);
-	sprintf(dir_name, "%s.dir", okuri_head_name);
-	db_remove_file(dir_name);
+#ifdef NEW_DB
+	sprintf(db_name, "%s.db", okuri_head_name);
+	db_remove_file(db_name);
+#else
+	sprintf(db_name, "%s.pag", okuri_head_name);
+	db_remove_file(db_name);
+	sprintf(db_name, "%s.dir", okuri_head_name);
+	db_remove_file(db_name);
+#endif
 
 	db_remove_file(okuri_tail_name);
-	sprintf(pag_name, "%s.pag", okuri_tail_name);
-	db_remove_file(pag_name);
-	sprintf(dir_name, "%s.dir", okuri_tail_name);
-	db_remove_file(dir_name);
+#ifdef NEW_DB
+	sprintf(db_name, "%s.db", okuri_tail_name);
+	db_remove_file(db_name);
+#else
+	sprintf(db_name, "%s.pag", okuri_tail_name);
+	db_remove_file(db_name);
+	sprintf(db_name, "%s.dir", okuri_tail_name);
+	db_remove_file(db_name);
+#endif
     }
 }
 
+#ifndef O_EXCL
+#define O_EXCL	0
+#endif
+
 /* ǡ١ե */
-static void db_make_files()
+static void db_make_files(tmpdir)
+	char *tmpdir;
 {
-    sprintf(file_name, "/tmp/skkjisyo.%d", getpid());
+    int pid = getpid();
+    int fd;
+
+    sprintf(file_name, "%s/skkjisyo.%d", tmpdir, pid);
     if (okurigana_flag) {
-	sprintf(okuri_head_name, "/tmp/skkhead.%d", getpid());
-	sprintf(okuri_tail_name, "/tmp/skktail.%d", getpid());
+	sprintf(okuri_head_name, "%s/skkhead.%d", tmpdir, pid);
+	sprintf(okuri_tail_name, "%s/skktail.%d", tmpdir, pid);
     }
     
     db_remove_files();
-    if ((db = dbm_open(file_name, O_RDWR|O_CREAT, 0600)) == NULL){
+    if ((db = dbm_open(file_name, O_RDWR|O_CREAT|O_EXCL, 0600)) == NULL){
 	perror(file_name);
 	exit(1);
     }
-    if ((dbcontent = fopen(file_name, "w+")) == NULL){
+    if ((fd = open(file_name, O_RDWR|O_CREAT|O_EXCL, 0600)) < 0 ||
+	(dbcontent = fdopen(fd, "w+")) == NULL){
 	perror(file_name);
 	exit(1);
     }
     if (okurigana_flag) {
-	if ((okuriheaddb = dbm_open(okuri_head_name, O_RDWR|O_CREAT, 0600)) 
+	if ((okuriheaddb = dbm_open(okuri_head_name, O_RDWR|O_CREAT|O_EXCL, 0600)) 
 	    == NULL){
 	    perror(okuri_head_name);
 	    exit(1);
 	}
-	if ((okuritaildb = dbm_open(okuri_tail_name, O_RDWR|O_CREAT, 0600)) 
+	if ((okuritaildb = dbm_open(okuri_tail_name, O_RDWR|O_CREAT|O_EXCL, 0600)) 
 	    == NULL){
 	    perror(okuri_tail_name);
 	    exit(1);
@@ -698,7 +727,7 @@ static void type_out(output)
     for (key = dbm_firstkey(db); key.dptr !=  NULL;  key = dbm_nextkey(db)) {
 	content = dbm_fetch(db, key);
 	for(i = 0; i < key.dsize; ++ i)
-	    putc((key.dptr)[i], output);
+	    putc(((char *) key.dptr)[i], output);
 	putc(' ', output);
 	fseek(dbcontent, getpos(content.dptr), 0);
 	db_gets(kanji, BLEN, dbcontent);
@@ -716,7 +745,7 @@ static void type_out(output)
 	    if (entry.dptr != NULL) continue;
 
 	    for(i = 0; i < key.dsize; ++ i)
-		putc((key.dptr)[i], output);
+		putc(((char *) key.dptr)[i], output);
 	    putc(' ', output);
 	    putc('/', output);
 	    okuri_type_out(&key, output);
@@ -775,9 +804,8 @@ int main(argc, argv)
 	exit(1);
     }
 
-    sprintf(file_name, "%s/skkjisyo.%d", tmpdir, getpid());
     set_signal_handler();
-    db_make_files();
+    db_make_files(tmpdir);
     
     negate = 0;
     for (; i < argc; ++ i) {
