+ return 1;
+
+}
+#endif
+
+static int config_handler(void *f, int ncols, char **vals, char **cols) {
+ struct config *conf = f;
+ struct nitem nitem;
+ struct stat existing;
+ char *save = 0;
+ char *note = 0;
+ char *notehash = 0;
+ int update = 0;
+
+ if (!read_item(conf, ncols, vals, cols, &nitem)) {
+ fprintf(stderr, "can't read item\n");
+ conf->errors++;
+ return conf->errabort;
+ }
+
+ unsigned int diffs = file_compare(&nitem, &existing);
+ if (diffs >= D_ERROR) {
+ return seterror(conf, "can't check %s", nitem.dest);
+ }
+
+ int exist = (!(diffs & D_NOEXIST));
+ int sametype = (!(diffs & D_TYPE));
+ //int mdsame = (!(diffs & D_MD));
+ int hashsame = (!(diffs & D_HASH));
+ int oldhashsame = (!(diffs & D_OHASH));
+ int isdir = (diffs & D_ISDIR);
+ int eisdir = (diffs & D_EISDIR);
+ update = (nitem.op == OP_UPDATE);
+
+ notehash = nitem.hash;
+
+ /* if the file doesn't exist in the system, nothing to do */
+ /* could possibly note if we expected it, but the regular handling
+ * should do that
+ */
+ if (!exist) {
+ return 0;
+ }
+
+ if (nitem.op == OP_UPDATE && !nitem.oldwasconf) {
+ /* possibly save anyway */
+ return 0;
+ }
+
+ /* so, old was conf, and something exists in the filesystem */
+
+ if (!sametype) {
+ warn("won't %s %s%s, %s exists",
+ nitem.op == OP_NEW ? "install" : nitem.opstr,
+ nitem.path,
+ isdir ? "/" : "",
+ eisdir ? "directory" : "file"
+ );
+ conf->errors++;
+ return conf->errabort;
+ }
+
+ /* all below are same type of file */
+ /* what about sametype, but old was different type */
+
+ if (isdir) {
+ return 0;