소스 검색

libdpkg: Move parsedb descriptor closure to parsedb_close()

Add a new parsedb flag to track if we need to close the file descriptor.
Guillem Jover 12 년 전
부모
커밋
509b759c93
2개의 변경된 파일10개의 추가작업 그리고 6개의 파일을 삭제
  1. 2 0
      lib/dpkg/dpkg-db.h
  2. 8 6
      lib/dpkg/parse.c

+ 2 - 0
lib/dpkg/dpkg-db.h

@@ -296,6 +296,8 @@ enum parsedbflags {
   pdb_lax_version_parser	= DPKG_BIT(6),
   /** Perform laxer parsing, used to transition to stricter parsing. */
   pdb_lax_parser		= pdb_lax_version_parser,
+  /** Close file descriptor on context destruction. */
+  pdb_close_fd			= DPKG_BIT(7),
 
   /* Standard operations. */
 

+ 8 - 6
lib/dpkg/parse.c

@@ -536,7 +536,7 @@ parsedb_open(const char *filename, enum parsedbflags flags)
     ohshite(_("failed to open package info file `%.255s' for reading"),
             filename);
 
-  ps = parsedb_new(filename, fd, flags);
+  ps = parsedb_new(filename, fd, flags | pdb_close_fd);
 
   push_cleanup(cu_closefd, ~ehflag_normaltidy, NULL, 0, 1, &ps->fd);
 
@@ -560,11 +560,6 @@ parsedb_open(const char *filename, enum parsedbflags flags)
     ps->data = ps->dataptr = ps->endptr = NULL;
   }
 
-  pop_cleanup(ehflag_normaltidy);
-
-  if (close(ps->fd))
-    ohshite(_("failed to close after read: `%.255s'"), filename);
-
   return ps;
 }
 
@@ -696,6 +691,13 @@ parse_stanza(struct parsedb_state *ps, struct field_state *fs,
 void
 parsedb_close(struct parsedb_state *ps)
 {
+  if (ps->flags & pdb_close_fd) {
+    pop_cleanup(ehflag_normaltidy);
+
+    if (close(ps->fd))
+      ohshite(_("failed to close after read: `%.255s'"), ps->filename);
+  }
+
   if (ps->data != NULL) {
 #ifdef USE_MMAP
     munmap(ps->data, ps->endptr - ps->data);