diff options
-rw-r--r-- | Makefile.am | 20 | ||||
-rw-r--r-- | Makefile.in | 283 | ||||
-rw-r--r-- | TODO.md | 5 | ||||
-rw-r--r-- | applets.h | 90 | ||||
-rwxr-xr-x | configure | 108 | ||||
-rw-r--r-- | configure.ac | 3 | ||||
-rw-r--r-- | libq/Makefile.am | 2 | ||||
-rw-r--r-- | libq/Makefile.in | 31 | ||||
-rw-r--r-- | libq/cache.h | 2 | ||||
-rw-r--r-- | libq/contents.c | 92 | ||||
-rw-r--r-- | libq/contents.h | 29 | ||||
-rw-r--r-- | libq/copy_file.c | 18 | ||||
-rw-r--r-- | libq/copy_file.h | 3 | ||||
-rw-r--r-- | libq/human_readable.c | 15 | ||||
-rw-r--r-- | libq/md5_sha1_sum.h | 3 | ||||
-rw-r--r-- | libq/scandirat.c | 8 | ||||
-rw-r--r-- | libq/scandirat.h | 1 | ||||
-rw-r--r-- | libq/vdb.c | 77 | ||||
-rw-r--r-- | libq/vdb.h | 5 | ||||
-rw-r--r-- | libq/xarray.h | 1 | ||||
-rw-r--r-- | libq/xpak.c | 369 | ||||
-rw-r--r-- | libq/xpak.h | 31 | ||||
-rw-r--r-- | libq/xregex.c | 17 | ||||
-rw-r--r-- | libq/xregex.h | 1 | ||||
-rw-r--r-- | main.c | 604 | ||||
-rw-r--r-- | main.h | 12 | ||||
-rw-r--r-- | q.c | 43 | ||||
-rw-r--r-- | qatom.c | 14 | ||||
-rw-r--r-- | qcache.c | 56 | ||||
-rw-r--r-- | qcheck.c | 20 | ||||
-rw-r--r-- | qdepends.c | 18 | ||||
-rw-r--r-- | qfile.c | 20 | ||||
-rw-r--r-- | qgrep.c | 91 | ||||
-rw-r--r-- | qlist.c | 42 | ||||
-rw-r--r-- | qlop.c | 18 | ||||
-rw-r--r-- | qmerge.c | 54 | ||||
-rw-r--r-- | qpkg.c | 94 | ||||
-rw-r--r-- | qsearch.c | 83 | ||||
-rw-r--r-- | qsize.c | 28 | ||||
-rw-r--r-- | qtbz2.c | 89 | ||||
-rw-r--r-- | qtegrity.c | 16 | ||||
-rw-r--r-- | quse.c | 66 | ||||
-rw-r--r-- | qxpak.c | 374 |
43 files changed, 1666 insertions, 1290 deletions
diff --git a/Makefile.am b/Makefile.am index bb1015c0..a9eba561 100644 --- a/Makefile.am +++ b/Makefile.am @@ -8,7 +8,25 @@ postsyncddir = $(portagedir)/repo.postsync.d dist_postsyncd_SCRIPTS = repo.postsync/q-reinit bin_PROGRAMS = q -q_SOURCES = main.c +q_SOURCES = \ + main.c \ + q.c \ + qatom.c \ + qcache.c \ + qcheck.c \ + qdepends.c \ + qfile.c \ + qgrep.c \ + qlist.c \ + qlop.c \ + qmerge.c \ + qpkg.c \ + qsearch.c \ + qsize.c \ + qtbz2.c \ + qtegrity.c \ + quse.c \ + qxpak.c q_CPPFLAGS = \ -I$(top_srcdir)/libq \ -I$(top_builddir)/autotools/gnulib \ diff --git a/Makefile.in b/Makefile.in index ee65a5d0..a014d258 100644 --- a/Makefile.in +++ b/Makefile.in @@ -248,7 +248,12 @@ CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(postsyncddir)" \ "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) -am_q_OBJECTS = q-main.$(OBJEXT) +am_q_OBJECTS = q-main.$(OBJEXT) q-q.$(OBJEXT) q-qatom.$(OBJEXT) \ + q-qcache.$(OBJEXT) q-qcheck.$(OBJEXT) q-qdepends.$(OBJEXT) \ + q-qfile.$(OBJEXT) q-qgrep.$(OBJEXT) q-qlist.$(OBJEXT) \ + q-qlop.$(OBJEXT) q-qmerge.$(OBJEXT) q-qpkg.$(OBJEXT) \ + q-qsearch.$(OBJEXT) q-qsize.$(OBJEXT) q-qtbz2.$(OBJEXT) \ + q-qtegrity.$(OBJEXT) q-quse.$(OBJEXT) q-qxpak.$(OBJEXT) q_OBJECTS = $(am_q_OBJECTS) am__DEPENDENCIES_1 = q_DEPENDENCIES = $(top_builddir)/libq/libq.la \ @@ -1542,7 +1547,26 @@ SUBDIRS = autotools/gnulib libq portagedir = $(sysconfdir)/portage postsyncddir = $(portagedir)/repo.postsync.d dist_postsyncd_SCRIPTS = repo.postsync/q-reinit -q_SOURCES = main.c +q_SOURCES = \ + main.c \ + q.c \ + qatom.c \ + qcache.c \ + qcheck.c \ + qdepends.c \ + qfile.c \ + qgrep.c \ + qlist.c \ + qlop.c \ + qmerge.c \ + qpkg.c \ + qsearch.c \ + qsize.c \ + qtbz2.c \ + qtegrity.c \ + quse.c \ + qxpak.c + # @@@ GEN START @@@ # q_CPPFLAGS = -I$(top_srcdir)/libq -I$(top_builddir)/autotools/gnulib \ @@ -1831,6 +1855,23 @@ distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q-main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q-q.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q-qatom.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q-qcache.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q-qcheck.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q-qdepends.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q-qfile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q-qgrep.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q-qlist.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q-qlop.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q-qmerge.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q-qpkg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q-qsearch.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q-qsize.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q-qtbz2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q-qtegrity.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q-quse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q-qxpak.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -1867,6 +1908,244 @@ q-main.obj: main.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` +q-q.o: q.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-q.o -MD -MP -MF $(DEPDIR)/q-q.Tpo -c -o q-q.o `test -f 'q.c' || echo '$(srcdir)/'`q.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-q.Tpo $(DEPDIR)/q-q.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='q.c' object='q-q.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-q.o `test -f 'q.c' || echo '$(srcdir)/'`q.c + +q-q.obj: q.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-q.obj -MD -MP -MF $(DEPDIR)/q-q.Tpo -c -o q-q.obj `if test -f 'q.c'; then $(CYGPATH_W) 'q.c'; else $(CYGPATH_W) '$(srcdir)/q.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-q.Tpo $(DEPDIR)/q-q.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='q.c' object='q-q.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-q.obj `if test -f 'q.c'; then $(CYGPATH_W) 'q.c'; else $(CYGPATH_W) '$(srcdir)/q.c'; fi` + +q-qatom.o: qatom.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qatom.o -MD -MP -MF $(DEPDIR)/q-qatom.Tpo -c -o q-qatom.o `test -f 'qatom.c' || echo '$(srcdir)/'`qatom.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qatom.Tpo $(DEPDIR)/q-qatom.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qatom.c' object='q-qatom.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qatom.o `test -f 'qatom.c' || echo '$(srcdir)/'`qatom.c + +q-qatom.obj: qatom.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qatom.obj -MD -MP -MF $(DEPDIR)/q-qatom.Tpo -c -o q-qatom.obj `if test -f 'qatom.c'; then $(CYGPATH_W) 'qatom.c'; else $(CYGPATH_W) '$(srcdir)/qatom.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qatom.Tpo $(DEPDIR)/q-qatom.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qatom.c' object='q-qatom.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qatom.obj `if test -f 'qatom.c'; then $(CYGPATH_W) 'qatom.c'; else $(CYGPATH_W) '$(srcdir)/qatom.c'; fi` + +q-qcache.o: qcache.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qcache.o -MD -MP -MF $(DEPDIR)/q-qcache.Tpo -c -o q-qcache.o `test -f 'qcache.c' || echo '$(srcdir)/'`qcache.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qcache.Tpo $(DEPDIR)/q-qcache.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qcache.c' object='q-qcache.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qcache.o `test -f 'qcache.c' || echo '$(srcdir)/'`qcache.c + +q-qcache.obj: qcache.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qcache.obj -MD -MP -MF $(DEPDIR)/q-qcache.Tpo -c -o q-qcache.obj `if test -f 'qcache.c'; then $(CYGPATH_W) 'qcache.c'; else $(CYGPATH_W) '$(srcdir)/qcache.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qcache.Tpo $(DEPDIR)/q-qcache.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qcache.c' object='q-qcache.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qcache.obj `if test -f 'qcache.c'; then $(CYGPATH_W) 'qcache.c'; else $(CYGPATH_W) '$(srcdir)/qcache.c'; fi` + +q-qcheck.o: qcheck.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qcheck.o -MD -MP -MF $(DEPDIR)/q-qcheck.Tpo -c -o q-qcheck.o `test -f 'qcheck.c' || echo '$(srcdir)/'`qcheck.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qcheck.Tpo $(DEPDIR)/q-qcheck.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qcheck.c' object='q-qcheck.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qcheck.o `test -f 'qcheck.c' || echo '$(srcdir)/'`qcheck.c + +q-qcheck.obj: qcheck.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qcheck.obj -MD -MP -MF $(DEPDIR)/q-qcheck.Tpo -c -o q-qcheck.obj `if test -f 'qcheck.c'; then $(CYGPATH_W) 'qcheck.c'; else $(CYGPATH_W) '$(srcdir)/qcheck.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qcheck.Tpo $(DEPDIR)/q-qcheck.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qcheck.c' object='q-qcheck.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qcheck.obj `if test -f 'qcheck.c'; then $(CYGPATH_W) 'qcheck.c'; else $(CYGPATH_W) '$(srcdir)/qcheck.c'; fi` + +q-qdepends.o: qdepends.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qdepends.o -MD -MP -MF $(DEPDIR)/q-qdepends.Tpo -c -o q-qdepends.o `test -f 'qdepends.c' || echo '$(srcdir)/'`qdepends.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qdepends.Tpo $(DEPDIR)/q-qdepends.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qdepends.c' object='q-qdepends.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qdepends.o `test -f 'qdepends.c' || echo '$(srcdir)/'`qdepends.c + +q-qdepends.obj: qdepends.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qdepends.obj -MD -MP -MF $(DEPDIR)/q-qdepends.Tpo -c -o q-qdepends.obj `if test -f 'qdepends.c'; then $(CYGPATH_W) 'qdepends.c'; else $(CYGPATH_W) '$(srcdir)/qdepends.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qdepends.Tpo $(DEPDIR)/q-qdepends.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qdepends.c' object='q-qdepends.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qdepends.obj `if test -f 'qdepends.c'; then $(CYGPATH_W) 'qdepends.c'; else $(CYGPATH_W) '$(srcdir)/qdepends.c'; fi` + +q-qfile.o: qfile.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qfile.o -MD -MP -MF $(DEPDIR)/q-qfile.Tpo -c -o q-qfile.o `test -f 'qfile.c' || echo '$(srcdir)/'`qfile.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qfile.Tpo $(DEPDIR)/q-qfile.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qfile.c' object='q-qfile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qfile.o `test -f 'qfile.c' || echo '$(srcdir)/'`qfile.c + +q-qfile.obj: qfile.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qfile.obj -MD -MP -MF $(DEPDIR)/q-qfile.Tpo -c -o q-qfile.obj `if test -f 'qfile.c'; then $(CYGPATH_W) 'qfile.c'; else $(CYGPATH_W) '$(srcdir)/qfile.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qfile.Tpo $(DEPDIR)/q-qfile.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qfile.c' object='q-qfile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qfile.obj `if test -f 'qfile.c'; then $(CYGPATH_W) 'qfile.c'; else $(CYGPATH_W) '$(srcdir)/qfile.c'; fi` + +q-qgrep.o: qgrep.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qgrep.o -MD -MP -MF $(DEPDIR)/q-qgrep.Tpo -c -o q-qgrep.o `test -f 'qgrep.c' || echo '$(srcdir)/'`qgrep.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qgrep.Tpo $(DEPDIR)/q-qgrep.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qgrep.c' object='q-qgrep.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qgrep.o `test -f 'qgrep.c' || echo '$(srcdir)/'`qgrep.c + +q-qgrep.obj: qgrep.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qgrep.obj -MD -MP -MF $(DEPDIR)/q-qgrep.Tpo -c -o q-qgrep.obj `if test -f 'qgrep.c'; then $(CYGPATH_W) 'qgrep.c'; else $(CYGPATH_W) '$(srcdir)/qgrep.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qgrep.Tpo $(DEPDIR)/q-qgrep.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qgrep.c' object='q-qgrep.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qgrep.obj `if test -f 'qgrep.c'; then $(CYGPATH_W) 'qgrep.c'; else $(CYGPATH_W) '$(srcdir)/qgrep.c'; fi` + +q-qlist.o: qlist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qlist.o -MD -MP -MF $(DEPDIR)/q-qlist.Tpo -c -o q-qlist.o `test -f 'qlist.c' || echo '$(srcdir)/'`qlist.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qlist.Tpo $(DEPDIR)/q-qlist.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qlist.c' object='q-qlist.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qlist.o `test -f 'qlist.c' || echo '$(srcdir)/'`qlist.c + +q-qlist.obj: qlist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qlist.obj -MD -MP -MF $(DEPDIR)/q-qlist.Tpo -c -o q-qlist.obj `if test -f 'qlist.c'; then $(CYGPATH_W) 'qlist.c'; else $(CYGPATH_W) '$(srcdir)/qlist.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qlist.Tpo $(DEPDIR)/q-qlist.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qlist.c' object='q-qlist.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qlist.obj `if test -f 'qlist.c'; then $(CYGPATH_W) 'qlist.c'; else $(CYGPATH_W) '$(srcdir)/qlist.c'; fi` + +q-qlop.o: qlop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qlop.o -MD -MP -MF $(DEPDIR)/q-qlop.Tpo -c -o q-qlop.o `test -f 'qlop.c' || echo '$(srcdir)/'`qlop.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qlop.Tpo $(DEPDIR)/q-qlop.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qlop.c' object='q-qlop.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qlop.o `test -f 'qlop.c' || echo '$(srcdir)/'`qlop.c + +q-qlop.obj: qlop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qlop.obj -MD -MP -MF $(DEPDIR)/q-qlop.Tpo -c -o q-qlop.obj `if test -f 'qlop.c'; then $(CYGPATH_W) 'qlop.c'; else $(CYGPATH_W) '$(srcdir)/qlop.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qlop.Tpo $(DEPDIR)/q-qlop.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qlop.c' object='q-qlop.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qlop.obj `if test -f 'qlop.c'; then $(CYGPATH_W) 'qlop.c'; else $(CYGPATH_W) '$(srcdir)/qlop.c'; fi` + +q-qmerge.o: qmerge.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qmerge.o -MD -MP -MF $(DEPDIR)/q-qmerge.Tpo -c -o q-qmerge.o `test -f 'qmerge.c' || echo '$(srcdir)/'`qmerge.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qmerge.Tpo $(DEPDIR)/q-qmerge.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qmerge.c' object='q-qmerge.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qmerge.o `test -f 'qmerge.c' || echo '$(srcdir)/'`qmerge.c + +q-qmerge.obj: qmerge.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qmerge.obj -MD -MP -MF $(DEPDIR)/q-qmerge.Tpo -c -o q-qmerge.obj `if test -f 'qmerge.c'; then $(CYGPATH_W) 'qmerge.c'; else $(CYGPATH_W) '$(srcdir)/qmerge.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qmerge.Tpo $(DEPDIR)/q-qmerge.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qmerge.c' object='q-qmerge.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qmerge.obj `if test -f 'qmerge.c'; then $(CYGPATH_W) 'qmerge.c'; else $(CYGPATH_W) '$(srcdir)/qmerge.c'; fi` + +q-qpkg.o: qpkg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qpkg.o -MD -MP -MF $(DEPDIR)/q-qpkg.Tpo -c -o q-qpkg.o `test -f 'qpkg.c' || echo '$(srcdir)/'`qpkg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qpkg.Tpo $(DEPDIR)/q-qpkg.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qpkg.c' object='q-qpkg.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qpkg.o `test -f 'qpkg.c' || echo '$(srcdir)/'`qpkg.c + +q-qpkg.obj: qpkg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qpkg.obj -MD -MP -MF $(DEPDIR)/q-qpkg.Tpo -c -o q-qpkg.obj `if test -f 'qpkg.c'; then $(CYGPATH_W) 'qpkg.c'; else $(CYGPATH_W) '$(srcdir)/qpkg.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qpkg.Tpo $(DEPDIR)/q-qpkg.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qpkg.c' object='q-qpkg.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qpkg.obj `if test -f 'qpkg.c'; then $(CYGPATH_W) 'qpkg.c'; else $(CYGPATH_W) '$(srcdir)/qpkg.c'; fi` + +q-qsearch.o: qsearch.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qsearch.o -MD -MP -MF $(DEPDIR)/q-qsearch.Tpo -c -o q-qsearch.o `test -f 'qsearch.c' || echo '$(srcdir)/'`qsearch.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qsearch.Tpo $(DEPDIR)/q-qsearch.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qsearch.c' object='q-qsearch.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qsearch.o `test -f 'qsearch.c' || echo '$(srcdir)/'`qsearch.c + +q-qsearch.obj: qsearch.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qsearch.obj -MD -MP -MF $(DEPDIR)/q-qsearch.Tpo -c -o q-qsearch.obj `if test -f 'qsearch.c'; then $(CYGPATH_W) 'qsearch.c'; else $(CYGPATH_W) '$(srcdir)/qsearch.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qsearch.Tpo $(DEPDIR)/q-qsearch.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qsearch.c' object='q-qsearch.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qsearch.obj `if test -f 'qsearch.c'; then $(CYGPATH_W) 'qsearch.c'; else $(CYGPATH_W) '$(srcdir)/qsearch.c'; fi` + +q-qsize.o: qsize.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qsize.o -MD -MP -MF $(DEPDIR)/q-qsize.Tpo -c -o q-qsize.o `test -f 'qsize.c' || echo '$(srcdir)/'`qsize.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qsize.Tpo $(DEPDIR)/q-qsize.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qsize.c' object='q-qsize.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qsize.o `test -f 'qsize.c' || echo '$(srcdir)/'`qsize.c + +q-qsize.obj: qsize.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qsize.obj -MD -MP -MF $(DEPDIR)/q-qsize.Tpo -c -o q-qsize.obj `if test -f 'qsize.c'; then $(CYGPATH_W) 'qsize.c'; else $(CYGPATH_W) '$(srcdir)/qsize.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qsize.Tpo $(DEPDIR)/q-qsize.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qsize.c' object='q-qsize.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qsize.obj `if test -f 'qsize.c'; then $(CYGPATH_W) 'qsize.c'; else $(CYGPATH_W) '$(srcdir)/qsize.c'; fi` + +q-qtbz2.o: qtbz2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qtbz2.o -MD -MP -MF $(DEPDIR)/q-qtbz2.Tpo -c -o q-qtbz2.o `test -f 'qtbz2.c' || echo '$(srcdir)/'`qtbz2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qtbz2.Tpo $(DEPDIR)/q-qtbz2.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qtbz2.c' object='q-qtbz2.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qtbz2.o `test -f 'qtbz2.c' || echo '$(srcdir)/'`qtbz2.c + +q-qtbz2.obj: qtbz2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qtbz2.obj -MD -MP -MF $(DEPDIR)/q-qtbz2.Tpo -c -o q-qtbz2.obj `if test -f 'qtbz2.c'; then $(CYGPATH_W) 'qtbz2.c'; else $(CYGPATH_W) '$(srcdir)/qtbz2.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qtbz2.Tpo $(DEPDIR)/q-qtbz2.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qtbz2.c' object='q-qtbz2.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qtbz2.obj `if test -f 'qtbz2.c'; then $(CYGPATH_W) 'qtbz2.c'; else $(CYGPATH_W) '$(srcdir)/qtbz2.c'; fi` + +q-qtegrity.o: qtegrity.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qtegrity.o -MD -MP -MF $(DEPDIR)/q-qtegrity.Tpo -c -o q-qtegrity.o `test -f 'qtegrity.c' || echo '$(srcdir)/'`qtegrity.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qtegrity.Tpo $(DEPDIR)/q-qtegrity.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qtegrity.c' object='q-qtegrity.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qtegrity.o `test -f 'qtegrity.c' || echo '$(srcdir)/'`qtegrity.c + +q-qtegrity.obj: qtegrity.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qtegrity.obj -MD -MP -MF $(DEPDIR)/q-qtegrity.Tpo -c -o q-qtegrity.obj `if test -f 'qtegrity.c'; then $(CYGPATH_W) 'qtegrity.c'; else $(CYGPATH_W) '$(srcdir)/qtegrity.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qtegrity.Tpo $(DEPDIR)/q-qtegrity.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qtegrity.c' object='q-qtegrity.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qtegrity.obj `if test -f 'qtegrity.c'; then $(CYGPATH_W) 'qtegrity.c'; else $(CYGPATH_W) '$(srcdir)/qtegrity.c'; fi` + +q-quse.o: quse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-quse.o -MD -MP -MF $(DEPDIR)/q-quse.Tpo -c -o q-quse.o `test -f 'quse.c' || echo '$(srcdir)/'`quse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-quse.Tpo $(DEPDIR)/q-quse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='quse.c' object='q-quse.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-quse.o `test -f 'quse.c' || echo '$(srcdir)/'`quse.c + +q-quse.obj: quse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-quse.obj -MD -MP -MF $(DEPDIR)/q-quse.Tpo -c -o q-quse.obj `if test -f 'quse.c'; then $(CYGPATH_W) 'quse.c'; else $(CYGPATH_W) '$(srcdir)/quse.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-quse.Tpo $(DEPDIR)/q-quse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='quse.c' object='q-quse.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-quse.obj `if test -f 'quse.c'; then $(CYGPATH_W) 'quse.c'; else $(CYGPATH_W) '$(srcdir)/quse.c'; fi` + +q-qxpak.o: qxpak.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qxpak.o -MD -MP -MF $(DEPDIR)/q-qxpak.Tpo -c -o q-qxpak.o `test -f 'qxpak.c' || echo '$(srcdir)/'`qxpak.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qxpak.Tpo $(DEPDIR)/q-qxpak.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qxpak.c' object='q-qxpak.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qxpak.o `test -f 'qxpak.c' || echo '$(srcdir)/'`qxpak.c + +q-qxpak.obj: qxpak.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT q-qxpak.obj -MD -MP -MF $(DEPDIR)/q-qxpak.Tpo -c -o q-qxpak.obj `if test -f 'qxpak.c'; then $(CYGPATH_W) 'qxpak.c'; else $(CYGPATH_W) '$(srcdir)/qxpak.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/q-qxpak.Tpo $(DEPDIR)/q-qxpak.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qxpak.c' object='q-qxpak.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(q_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o q-qxpak.obj `if test -f 'qxpak.c'; then $(CYGPATH_W) 'qxpak.c'; else $(CYGPATH_W) '$(srcdir)/qxpak.c'; fi` + mostlyclean-libtool: -rm -f *.lo @@ -49,6 +49,7 @@ - support TTL field in binpkgs file - merge duplicate atoms on the CLI (`qmerge -Uq nano nano nano`) - unmerging should clean out @world set +- test should work on local vdb (so TRAVIS can test it too) # qdepends @@ -66,3 +67,7 @@ # qsync - rewrite to use new repos.conf standard + +# qgrep + +- make it use standard xarray instead of its own buf\_list @@ -1,13 +1,36 @@ /* - * Copyright 2005-2018 Gentoo Foundation + * Copyright 2005-2019 Gentoo Foundation * Distributed under the terms of the GNU General Public License v2 * * Copyright 2005-2010 Ned Ludd - <solar@gentoo.org> * Copyright 2005-2014 Mike Frysinger - <vapier@gentoo.org> */ -#ifndef _QAPPLETS_H_ -#define _QAPPLETS_H_ +#ifndef _APPLETS_H_ +#define _APPLETS_H_ 1 + +#if defined(__sun) && defined(__SVR4) +/* workaround non-const defined name in option struct, such that we + * don't get a zillion of warnings */ +#define no_argument 0 +#define required_argument 1 +#define optional_argument 2 +struct option { + const char *name; + int has_arg; + int *flag; + int val; +}; +extern int getopt_long(int, char * const *, const char *, + const struct option *, int *); +#else +# include <getopt.h> +#endif + +#include <stdbool.h> +#include <dirent.h> + +#include "xarray.h" /* applet prototypes */ typedef int (*APPLET)(int, char **); @@ -34,11 +57,6 @@ DECLARE_APPLET(qcache) DECLARE_APPLET(qtegrity) #undef DECLARE_APPLET -#define DEFINE_APPLET_STUB(applet) \ - int applet##_main(_q_unused_ int argc, _q_unused_ char **argv) { \ - err("Sorry, this applet has been disabled"); \ - } - static const struct applet_t { const char *name; APPLET func; @@ -92,4 +110,60 @@ static const struct applet_t { {NULL, NULL, NULL, NULL} }; +/* Common usage for all applets */ +#define COMMON_FLAGS "vqChV" +#define COMMON_LONG_OPTS \ + {"root", a_argument, NULL, 0x1}, \ + {"verbose", no_argument, NULL, 'v'}, \ + {"quiet", no_argument, NULL, 'q'}, \ + {"nocolor", no_argument, NULL, 'C'}, \ + {"help", no_argument, NULL, 'h'}, \ + {"version", no_argument, NULL, 'V'}, \ + {NULL, no_argument, NULL, 0x0} +#define COMMON_OPTS_HELP \ + "Set the ROOT env var", \ + "Make a lot of noise", \ + "Tighter output; suppress warnings", \ + "Don't output color", \ + "Print this help and exit", \ + "Print version and exit", \ + NULL +#define COMMON_GETOPTS_CASES(applet) \ + case 0x1: portroot = optarg; break; \ + case 'v': ++verbose; break; \ + case 'q': setup_quiet(); break; \ + case 'V': version_barf(); break; \ + case 'h': applet ## _usage(EXIT_SUCCESS); break; \ + case 'C': no_colors(); break; \ + default: applet ## _usage(EXIT_FAILURE); break; + +extern char *modpath; +extern char *portroot; +extern int verbose; +extern int quiet; +extern char pretend; +extern char *config_protect; +extern char *config_protect_mask; +extern char *portvdb; +extern char *portlogdir; +extern int portcachedir_type; +extern char *pkg_install_mask; +extern char *binhost; +extern char *pkgdir; +extern char *port_tmpdir; +extern char *features; +extern char *install_mask; +extern DEFINE_ARRAY(overlays); + +void no_colors(void); +void setup_quiet(void); +void version_barf(void); +void usage(int status, const char *flags, struct option const opts[], + const char * const help[], const char *desc, int blabber); +int lookup_applet_idx(const char *); +APPLET lookup_applet(const char *applet); +const char *initialize_flat(const char *overlay, int cache_type, bool force); +void freeargv(int argc, char **argv); +void makeargv(const char *string, int *argc, char ***argv); + #endif @@ -34569,42 +34569,6 @@ else fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wno-missing-prototypes" >&5 -$as_echo_n "checking whether C compiler accepts -Wno-missing-prototypes... " >&6; } -if ${ax_cv_check_cflags___Wno_missing_prototypes+:} false; then : - $as_echo_n "(cached) " >&6 -else - - ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS -Wno-missing-prototypes" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ax_cv_check_cflags___Wno_missing_prototypes=yes -else - ax_cv_check_cflags___Wno_missing_prototypes=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - CFLAGS=$ax_check_save_flags -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___Wno_missing_prototypes" >&5 -$as_echo "$ax_cv_check_cflags___Wno_missing_prototypes" >&6; } -if test "x$ax_cv_check_cflags___Wno_missing_prototypes" = xyes; then : - as_fn_append CFLAGS " -Wno-missing-prototypes" -else - : -fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wwrite-strings" >&5 $as_echo_n "checking whether C compiler accepts -Wwrite-strings... " >&6; } if ${ax_cv_check_cflags___Wwrite_strings+:} false; then : @@ -34857,42 +34821,6 @@ else fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wno-format-nonliteral" >&5 -$as_echo_n "checking whether C compiler accepts -Wno-format-nonliteral... " >&6; } -if ${ax_cv_check_cflags___Wno_format_nonliteral+:} false; then : - $as_echo_n "(cached) " >&6 -else - - ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS -Wno-format-nonliteral" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ax_cv_check_cflags___Wno_format_nonliteral=yes -else - ax_cv_check_cflags___Wno_format_nonliteral=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - CFLAGS=$ax_check_save_flags -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___Wno_format_nonliteral" >&5 -$as_echo "$ax_cv_check_cflags___Wno_format_nonliteral" >&6; } -if test "x$ax_cv_check_cflags___Wno_format_nonliteral" = xyes; then : - as_fn_append CFLAGS " -Wno-format-nonliteral" -else - : -fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wsequence-point" >&5 $as_echo_n "checking whether C compiler accepts -Wsequence-point... " >&6; } if ${ax_cv_check_cflags___Wsequence_point+:} false; then : @@ -35001,42 +34929,6 @@ else fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wno-expansion-to-defined" >&5 -$as_echo_n "checking whether C compiler accepts -Wno-expansion-to-defined... " >&6; } -if ${ax_cv_check_cflags___Wno_expansion_to_defined+:} false; then : - $as_echo_n "(cached) " >&6 -else - - ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS -Wno-expansion-to-defined" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ax_cv_check_cflags___Wno_expansion_to_defined=yes -else - ax_cv_check_cflags___Wno_expansion_to_defined=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - CFLAGS=$ax_check_save_flags -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___Wno_expansion_to_defined" >&5 -$as_echo "$ax_cv_check_cflags___Wno_expansion_to_defined" >&6; } -if test "x$ax_cv_check_cflags___Wno_expansion_to_defined" = xyes; then : - as_fn_append CFLAGS " -Wno-expansion-to-defined" -else - : -fi - - ac_config_files="$ac_config_files Makefile libq/Makefile autotools/gnulib/Makefile tests/atom_explode/Makefile tests/copy_file/Makefile tests/mkdir/Makefile tests/rmspace/Makefile" diff --git a/configure.ac b/configure.ac index 55346a84..c7f6e698 100644 --- a/configure.ac +++ b/configure.ac @@ -36,7 +36,6 @@ m4_foreach_w([flag], [ -Wshadow -Wformat=2 -Wmissing-declarations - -Wno-missing-prototypes -Wwrite-strings -Wbad-function-cast -Wnested-externs @@ -44,11 +43,9 @@ m4_foreach_w([flag], [ -Winline -Wchar-subscripts -Wcast-align - -Wno-format-nonliteral -Wsequence-point -Wold-style-definition -Wextra - -Wno-expansion-to-defined ], [ AX_CHECK_COMPILE_FLAG(flag, AS_VAR_APPEND([CFLAGS], " flag")) ]) diff --git a/libq/Makefile.am b/libq/Makefile.am index 26647ee8..734a78f4 100644 --- a/libq/Makefile.am +++ b/libq/Makefile.am @@ -5,6 +5,7 @@ QFILES = \ busybox.h \ cache.c cache.h \ colors.c colors.h \ + contents.c contents.h \ copy_file.c copy_file.h \ eat_file.c eat_file.h \ hash_fd.c hash_fd.h \ @@ -22,6 +23,7 @@ QFILES = \ xasprintf.h \ xchdir.c xchdir.h \ xmkdir.c xmkdir.h \ + xpak.c xpak.h \ xregex.c xregex.h \ xsystem.c xsystem.h \ $(NULL) diff --git a/libq/Makefile.in b/libq/Makefile.in index 6c529c27..ab7012fb 100644 --- a/libq/Makefile.in +++ b/libq/Makefile.in @@ -242,12 +242,13 @@ CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libq_la_LIBADD = am__objects_1 = libq_la-atom.lo libq_la-basename.lo libq_la-cache.lo \ - libq_la-colors.lo libq_la-copy_file.lo libq_la-eat_file.lo \ - libq_la-hash_fd.lo libq_la-human_readable.lo \ - libq_la-md5_sha1_sum.lo libq_la-prelink.lo libq_la-profile.lo \ - libq_la-rmspace.lo libq_la-safe_io.lo libq_la-scandirat.lo \ - libq_la-set.lo libq_la-vdb.lo libq_la-xarray.lo \ - libq_la-xchdir.lo libq_la-xmkdir.lo libq_la-xregex.lo \ + libq_la-colors.lo libq_la-contents.lo libq_la-copy_file.lo \ + libq_la-eat_file.lo libq_la-hash_fd.lo \ + libq_la-human_readable.lo libq_la-md5_sha1_sum.lo \ + libq_la-prelink.lo libq_la-profile.lo libq_la-rmspace.lo \ + libq_la-safe_io.lo libq_la-scandirat.lo libq_la-set.lo \ + libq_la-vdb.lo libq_la-xarray.lo libq_la-xchdir.lo \ + libq_la-xmkdir.lo libq_la-xpak.lo libq_la-xregex.lo \ libq_la-xsystem.lo am_libq_la_OBJECTS = $(am__objects_1) libq_la_OBJECTS = $(am_libq_la_OBJECTS) @@ -1447,6 +1448,7 @@ QFILES = \ busybox.h \ cache.c cache.h \ colors.c colors.h \ + contents.c contents.h \ copy_file.c copy_file.h \ eat_file.c eat_file.h \ hash_fd.c hash_fd.h \ @@ -1464,6 +1466,7 @@ QFILES = \ xasprintf.h \ xchdir.c xchdir.h \ xmkdir.c xmkdir.h \ + xpak.c xpak.h \ xregex.c xregex.h \ xsystem.c xsystem.h \ $(NULL) @@ -1532,6 +1535,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libq_la-basename.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libq_la-cache.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libq_la-colors.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libq_la-contents.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libq_la-copy_file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libq_la-eat_file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libq_la-hash_fd.Plo@am__quote@ @@ -1547,6 +1551,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libq_la-xarray.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libq_la-xchdir.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libq_la-xmkdir.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libq_la-xpak.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libq_la-xregex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libq_la-xsystem.Plo@am__quote@ @@ -1599,6 +1604,13 @@ libq_la-colors.lo: colors.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libq_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libq_la-colors.lo `test -f 'colors.c' || echo '$(srcdir)/'`colors.c +libq_la-contents.lo: contents.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libq_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libq_la-contents.lo -MD -MP -MF $(DEPDIR)/libq_la-contents.Tpo -c -o libq_la-contents.lo `test -f 'contents.c' || echo '$(srcdir)/'`contents.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libq_la-contents.Tpo $(DEPDIR)/libq_la-contents.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='contents.c' object='libq_la-contents.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libq_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libq_la-contents.lo `test -f 'contents.c' || echo '$(srcdir)/'`contents.c + libq_la-copy_file.lo: copy_file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libq_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libq_la-copy_file.lo -MD -MP -MF $(DEPDIR)/libq_la-copy_file.Tpo -c -o libq_la-copy_file.lo `test -f 'copy_file.c' || echo '$(srcdir)/'`copy_file.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libq_la-copy_file.Tpo $(DEPDIR)/libq_la-copy_file.Plo @@ -1704,6 +1716,13 @@ libq_la-xmkdir.lo: xmkdir.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libq_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libq_la-xmkdir.lo `test -f 'xmkdir.c' || echo '$(srcdir)/'`xmkdir.c +libq_la-xpak.lo: xpak.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libq_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libq_la-xpak.lo -MD -MP -MF $(DEPDIR)/libq_la-xpak.Tpo -c -o libq_la-xpak.lo `test -f 'xpak.c' || echo '$(srcdir)/'`xpak.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libq_la-xpak.Tpo $(DEPDIR)/libq_la-xpak.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xpak.c' object='libq_la-xpak.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libq_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libq_la-xpak.lo `test -f 'xpak.c' || echo '$(srcdir)/'`xpak.c + libq_la-xregex.lo: xregex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libq_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libq_la-xregex.lo -MD -MP -MF $(DEPDIR)/libq_la-xregex.Tpo -c -o libq_la-xregex.lo `test -f 'xregex.c' || echo '$(srcdir)/'`xregex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libq_la-xregex.Tpo $(DEPDIR)/libq_la-xregex.Plo diff --git a/libq/cache.h b/libq/cache.h index 971417c1..93421dfc 100644 --- a/libq/cache.h +++ b/libq/cache.h @@ -10,6 +10,8 @@ #ifndef _CACHE_H #define _CACHE_H 1 +#include "atom.h" + typedef struct { char *_data; char *DEPEND; /* line 1 */ diff --git a/libq/contents.c b/libq/contents.c new file mode 100644 index 00000000..41929d06 --- /dev/null +++ b/libq/contents.c @@ -0,0 +1,92 @@ +/* + * Copyright 2005-2019 Gentoo Foundation + * Distributed under the terms of the GNU General Public License v2 + * + * Copyright 2005-2008 Ned Ludd - <solar@gentoo.org> + * Copyright 2005-2014 Mike Frysinger - <vapier@gentoo.org> + * Copyright 2018- Fabian Groffen - <grobian@gentoo.org> + */ + +#include "main.h" + +#include <stdlib.h> +#include <string.h> + +#include "contents.h" + +/* + * Parse a line of CONTENTS file and provide access to the individual fields + */ +contents_entry * +contents_parse_line(char *line) +{ + static contents_entry e; + char *p; + + if (!line || !*line || *line == '\n') + return NULL; + + /* chop trailing newline */ + if ((p = strrchr(line, '\n')) != NULL) + *p = '\0'; + + /* ferringb wants to break portage/vdb by using tabs vs spaces + * so filenames can have lame ass spaces in them.. + * (I smell Windows near by) + * Anyway we just convert that crap to a space so we can still + * parse quickly */ + p = line; + while ((p = strchr(p, '\t')) != NULL) + *p = ' '; + + memset(&e, 0x00, sizeof(e)); + e._data = line; + + if (!strncmp(e._data, "obj ", 4)) + e.type = CONTENTS_OBJ; + else if (!strncmp(e._data, "dir ", 4)) + e.type = CONTENTS_DIR; + else if (!strncmp(e._data, "sym ", 4)) + e.type = CONTENTS_SYM; + else + return NULL; + + e.name = e._data + 4; + + switch (e.type) { + /* dir /bin */ + case CONTENTS_DIR: + break; + + /* obj /bin/bash 62ed51c8b23866777552643ec57614b0 1120707577 */ + case CONTENTS_OBJ: + if ((e.mtime_str = strrchr(e.name, ' ')) == NULL) + return NULL; + *e.mtime_str++ = '\0'; + if ((e.digest = strrchr(e.name, ' ')) == NULL) + return NULL; + *e.digest++ = '\0'; + break; + + /* sym /bin/sh -> bash 1120707577 */ + case CONTENTS_SYM: + if ((e.mtime_str = strrchr(e.name, ' ')) == NULL) + return NULL; + *e.mtime_str++ = '\0'; + if ((e.sym_target = strstr(e.name, " -> ")) == NULL) + return NULL; + *e.sym_target = '\0'; + e.sym_target += 4; + break; + } + + if (e.mtime_str) { + e.mtime = strtol(e.mtime_str, NULL, 10); + if (e.mtime == LONG_MAX) { + e.mtime = 0; + e.mtime_str = NULL; + } + } + + return &e; +} diff --git a/libq/contents.h b/libq/contents.h new file mode 100644 index 00000000..c7668277 --- /dev/null +++ b/libq/contents.h @@ -0,0 +1,29 @@ +/* + * Copyright 2005-2019 Gentoo Foundation + * Distributed under the terms of the GNU General Public License v2 + * + * Copyright 2005-2008 Ned Ludd - <solar@gentoo.org> + * Copyright 2005-2014 Mike Frysinger - <vapier@gentoo.org> + * Copyright 2018- Fabian Groffen - <grobian@gentoo.org> + */ + +#ifndef _CONTENTS_H +#define _CONTENTS_H 1 + +typedef enum { + CONTENTS_DIR, CONTENTS_OBJ, CONTENTS_SYM +} contents_type; + +typedef struct { + contents_type type; + char *_data; + char *name; + char *sym_target; + char *digest; + char *mtime_str; + long mtime; +} contents_entry; + +contents_entry *contents_parse_line(char *line); + +#endif diff --git a/libq/copy_file.c b/libq/copy_file.c index e013442f..e4619ceb 100644 --- a/libq/copy_file.c +++ b/libq/copy_file.c @@ -26,3 +26,21 @@ int copy_file_fd(int fd_src, int fd_dst) return -1; } } + +int copy_file(FILE *src, FILE *dst) +{ + ssize_t rcnt, wcnt; + char buf[64 * 1024]; + + while (1) { + rcnt = fread(buf, 1, sizeof(buf), src); + if (rcnt < 0) + return -1; + else if (rcnt == 0) + return 0; + + wcnt = fwrite(buf, 1, rcnt, dst); + if (wcnt == -1 || wcnt != rcnt) + return -1; + } +} diff --git a/libq/copy_file.h b/libq/copy_file.h index 41da823c..080c99e0 100644 --- a/libq/copy_file.h +++ b/libq/copy_file.h @@ -8,6 +8,9 @@ #ifndef _COPY_FILE_H #define _COPY_FILE_H 1 +#include <stdio.h> + int copy_file_fd(int fd_src, int fd_dst); +int copy_file(FILE *src, FILE *dst); #endif diff --git a/libq/human_readable.c b/libq/human_readable.c index 855ecef1..5b8f7a3b 100644 --- a/libq/human_readable.c +++ b/libq/human_readable.c @@ -38,14 +38,12 @@ make_human_readable_str(unsigned long long val, unsigned frac; /* 0..9 - the fractional digit */ const char *u; - const char *fmt; static char str[21]; /* Sufficient for 64 bit unsigned integers. */ if (val == 0) return "0"; - fmt = "%llu"; if (block_size > 1) val *= block_size; frac = 0; @@ -55,11 +53,11 @@ make_human_readable_str(unsigned long long val, val += display_unit/2; /* Deal with rounding */ val /= display_unit; /* Don't combine with the line above! */ /* will just print it as ulonglong (below) */ + snprintf(str, sizeof(str), "%llu", val); } else { while ((val >= 1024) /* && (u < unit_chars + sizeof(unit_chars) - 1) - always true */ ) { - fmt = "%llu.%u%c"; u++; frac = (((unsigned)val % 1024) * 10 + 1024/2) / 1024; val /= 1024; @@ -68,19 +66,18 @@ make_human_readable_str(unsigned long long val, ++val; frac = 0; } -#if 1 /* If block_size is 0, dont print fractional part */ if (block_size == 0) { if (frac >= 5) { ++val; } - fmt = "%llu%*c"; - frac = 1; + snprintf(str, sizeof(str), "%llu%c", val, *u); + } else if (u == unit_chars) { + snprintf(str, sizeof(str), "%llu", val); + } else { + snprintf(str, sizeof(str), "%llu.%u%c", val, frac, *u); } -#endif } - snprintf(str, sizeof(str), fmt, val, frac, *u); - return str; } diff --git a/libq/md5_sha1_sum.h b/libq/md5_sha1_sum.h index a4d7b1e7..3c682a40 100644 --- a/libq/md5_sha1_sum.h +++ b/libq/md5_sha1_sum.h @@ -6,6 +6,9 @@ #ifndef _MD5_SHA1_SUM_H #define _MD5_SHA1_SUM_H 1 +/* for HASH_MD5/HASH_SHA1 */ +#include "busybox.h" + /* pass in a fd and get back a fd; filename is for display only */ typedef int (*hash_cb_t) (int, const char *); diff --git a/libq/scandirat.c b/libq/scandirat.c index c98ce59a..b3d0cfec 100644 --- a/libq/scandirat.c +++ b/libq/scandirat.c @@ -84,3 +84,11 @@ scandir_free(struct dirent **de, int cnt) free(de[cnt]); free(de); } + +int +filter_hidden(const struct dirent *dentry) +{ + if (dentry->d_name[0] == '.') + return 0; + return 1; +} diff --git a/libq/scandirat.h b/libq/scandirat.h index 10ff2563..950cbb1a 100644 --- a/libq/scandirat.h +++ b/libq/scandirat.h @@ -19,5 +19,6 @@ int scandirat( #endif void scandir_free(struct dirent **de, int cnt); +int filter_hidden(const struct dirent *dentry); #endif @@ -10,6 +10,8 @@ #include "rmspace.h" #include "scandirat.h" #include "eat_file.h" +#include "set.h" +#include "atom.h" #include "vdb.h" #include <ctype.h> @@ -345,3 +347,78 @@ next_entry: return ret; } + +set * +get_vdb_atoms(const char *sroot, const char *svdb, int fullcpv) +{ + q_vdb_ctx *ctx; + + int cfd, j; + int dfd, i; + + char buf[_Q_PATH_MAX]; + char slot[_Q_PATH_MAX]; + char *slotp = slot; + size_t slot_len; + + struct dirent **cat; + struct dirent **pf; + + depend_atom *atom = NULL; + set *cpf = NULL; + + ctx = q_vdb_open(sroot, svdb); + if (!ctx) + return NULL; + + /* scan the cat first */ + cfd = scandirat(ctx->vdb_fd, ".", &cat, q_vdb_filter_cat, alphasort); + if (cfd < 0) + goto fuckit; + + for (j = 0; j < cfd; j++) { + dfd = scandirat(ctx->vdb_fd, cat[j]->d_name, + &pf, q_vdb_filter_pkg, alphasort); + if (dfd < 0) + continue; + for (i = 0; i < dfd; i++) { + int blen = snprintf(buf, sizeof(buf), "%s/%s/SLOT", + cat[j]->d_name, pf[i]->d_name); + if (blen < 0 || (size_t)blen >= sizeof(buf)) { + warnf("unable to parse long package: %s/%s", + cat[j]->d_name, pf[i]->d_name); + continue; + } + + /* Chop the SLOT for the atom parsing. */ + buf[blen - 5] = '\0'; + if ((atom = atom_explode(buf)) == NULL) + continue; + /* Restore the SLOT. */ + buf[blen - 5] = '/'; + + slot_len = sizeof(slot); + eat_file_at(ctx->vdb_fd, buf, &slotp, &slot_len); + rmspace(slot); + + if (fullcpv) { + if (atom->PR_int) + snprintf(buf, sizeof(buf), "%s/%s-%s-r%i", + atom->CATEGORY, atom->PN, atom->PV, atom->PR_int); + else + snprintf(buf, sizeof(buf), "%s/%s-%s", + atom->CATEGORY, atom->PN, atom->PV); + } else { + snprintf(buf, sizeof(buf), "%s/%s", atom->CATEGORY, atom->PN); + } + atom_implode(atom); + cpf = add_set(buf, cpf); + } + scandir_free(pf, dfd); + } + scandir_free(cat, cfd); + + fuckit: + q_vdb_close(ctx); + return cpf; +} @@ -6,6 +6,10 @@ #ifndef _VDB_H #define _VDB_H 1 +#include <dirent.h> + +#include "set.h" + /* VDB context */ typedef struct { int portroot_fd, vdb_fd; @@ -56,5 +60,6 @@ int q_vdb_foreach_pkg(const char *sroot, const char *svdb, int q_vdb_foreach_pkg_sorted(const char *sroot, const char *svdb, q_vdb_pkg_cb callback, void *priv); struct dirent *q_vdb_get_next_dir(DIR *dir); +set *get_vdb_atoms(const char *sroot, const char *svdb, int fullcpv); #endif diff --git a/libq/xarray.h b/libq/xarray.h index 46cd7720..22ee47aa 100644 --- a/libq/xarray.h +++ b/libq/xarray.h @@ -33,6 +33,7 @@ typedef struct { #define array_init_decl { .eles = NULL, .num = 0, } #define array_cnt(arr) (arr)->num #define DECLARE_ARRAY(arr) array_t _##arr = array_init_decl, *arr = &_##arr +#define DEFINE_ARRAY(arr) array_t *arr; #define xarraypush_str(arr, ele) xarraypush(arr, ele, strlen(ele) + 1 /*NUL*/) #define xarraypush_struct(arr, ele) xarraypush(arr, ele, sizeof(*(ele))) diff --git a/libq/xpak.c b/libq/xpak.c new file mode 100644 index 00000000..09b58bd0 --- /dev/null +++ b/libq/xpak.c @@ -0,0 +1,369 @@ +/* + * Copyright 2005-2019 Gentoo Foundation + * Distributed under the terms of the GNU General Public License v2 + * + * Copyright 2005-2010 Ned Ludd - <solar@gentoo.org> + * Copyright 2005-2014 Mike Frysinger - <vapier@gentoo.org> + */ + +#include "main.h" + +#include <stdio.h> +#include <string.h> +#include <xalloc.h> +#include <assert.h> + +#include "basename.h" +#include "copy_file.h" +#include "safe_io.h" +#include "scandirat.h" +#include "xpak.h" + +/* +# The format for a tbz2/xpak: +# +# tbz2: tar.bz2 + xpak + (xpak_offset) + "STOP" +# xpak: "XPAKPACK" + (index_len) + (data_len) + index + data + "XPAKSTOP" +# index: (pathname_len) + pathname + (data_offset) + (data_len) +# index entries are concatenated end-to-end. +# data: concatenated data chunks, end-to-end. +# +# [tarball]XPAKPACKIIIIDDDD[index][data]XPAKSTOPOOOOSTOP +# +# (integer) == encodeint(integer) ===> 4 characters (big-endian copy) +# '+' means concatenate the fields ===> All chunks are strings +*/ +#define XPAK_START_MSG "XPAKPACK" +#define XPAK_START_MSG_LEN 8 +#define XPAK_START_LEN (8 + 4 + 4) +#define XPAK_END_MSG "XPAKSTOP" +#define XPAK_END_MSG_LEN 8 + +typedef struct { + int dir_fd; + FILE *fp; + int index_len; + int data_len; + char *index, *data; +} _xpak_archive; + +typedef void (*xpak_callback_t)(int,char*,int,int,int,char*); + +static void _xpak_walk_index( + _xpak_archive *x, + int argc, + char **argv, + xpak_callback_t func) +{ + int i, pathname_len, data_offset, data_len; + char *p, pathname[100]; + + p = x->index; + while ((p - x->index) < x->index_len) { + pathname_len = READ_BE_INT32((unsigned char*)p); + assert((size_t)pathname_len < sizeof(pathname)); + p += 4; + memcpy(pathname, p, pathname_len); + pathname[pathname_len] = '\0'; + if (strchr(pathname, '/') != NULL || strchr(pathname, '\\') != NULL) + err("Index contains a file with a path: '%s'", pathname); + p += pathname_len; + data_offset = READ_BE_INT32((unsigned char*)p); + p += 4; + data_len = READ_BE_INT32((unsigned char*)p); + p += 4; + if (argc) { + for (i = 0; i < argc; ++i) { + if (argv[i] && !strcmp(pathname, argv[i])) { + argv[i] = NULL; + break; + } + } + if (i == argc) + continue; + } + (*func)(x->dir_fd, pathname, pathname_len, + data_offset, data_len, x->data); + } + + if (argc) + for (i = 0; i < argc; ++i) + if (argv[i]) + warn("Could not locate '%s' in archive", argv[i]); +} + +static _xpak_archive *_xpak_open(const char *file) +{ + static _xpak_archive ret; + char buf[XPAK_START_LEN]; + + /* init the file */ + memset(&ret, 0x00, sizeof(ret)); + if (file[0] == '-' && file[1] == '\0') + ret.fp = stdin; + else if ((ret.fp = fopen(file, "r")) == NULL) + return NULL; + + /* verify this xpak doesnt suck */ + if (fread(buf, 1, XPAK_START_LEN, ret.fp) != XPAK_START_LEN) + goto close_and_ret; + if (memcmp(buf, XPAK_START_MSG, XPAK_START_MSG_LEN)) { + warn("%s: Invalid xpak", file); + goto close_and_ret; + } + + /* calc index and data sizes */ + ret.index_len = READ_BE_INT32((unsigned char*)buf+XPAK_START_MSG_LEN); + ret.data_len = READ_BE_INT32((unsigned char*)buf+XPAK_START_MSG_LEN+4); + if (!ret.index_len || !ret.data_len) { + warn("Skipping empty archive '%s'", file); + goto close_and_ret; + } + + return &ret; + +close_and_ret: + if (ret.fp != stdin) + fclose(ret.fp); + return NULL; +} + +static void _xpak_close(_xpak_archive *x) +{ + fclose(x->fp); +} + +int +xpak_list( + int dir_fd, + const char *file, + int argc, + char **argv, + xpak_callback_t func) +{ + _xpak_archive *x; + char buf[BUFSIZE]; + size_t ret; + + x = _xpak_open(file); + if (!x) + return 1; + + x->dir_fd = dir_fd; + x->index = buf; + assert((size_t)x->index_len < sizeof(buf)); + ret = fread(x->index, 1, x->index_len, x->fp); + assert(ret == (size_t)x->index_len); + _xpak_walk_index(x, argc, argv, func); + + _xpak_close(x); + + return 0; +} + +int +xpak_extract( + int dir_fd, + const char *file, + int argc, + char **argv, + xpak_callback_t func) +{ + _xpak_archive *x; + char buf[BUFSIZE], ext[BUFSIZE*32]; + size_t in; + + x = _xpak_open(file); + if (!x) + return 1; + + x->dir_fd = dir_fd; + x->index = buf; + + assert((size_t)x->index_len < sizeof(buf)); + in = fread(x->index, 1, x->index_len, x->fp); + if ((int)in != x->index_len) + err("index chunk: read %i bytes, wanted %i bytes", + (int)in, x->index_len); + + /* the xpak may be large (like when it has CONTENTS) #300744 */ + x->data = (size_t)x->data_len < sizeof(ext) ? ext : xmalloc(x->data_len); + in = fread(x->data, 1, x->data_len, x->fp); + if ((int)in != x->data_len) + err("data chunk: read %i bytes, wanted %i bytes", (int)in, x->data_len); + + _xpak_walk_index(x, argc, argv, func); + + _xpak_close(x); + + if (x->data != ext) + free(x->data); + + return 0; +} + +static void +_xpak_add_file( + int dir_fd, + const char *filename, + struct stat *st, + FILE *findex, + int *index_len, + FILE *fdata, + int *data_len, + int verbose) +{ + FILE *fin; + unsigned char intbuf[4]; + unsigned char *p = intbuf; + const char *basefile; + int fd, in_len; + + basefile = basename(filename); + + if (verbose == 1) + printf("%s\n", basefile); + else if (verbose) + printf("%s @ offset byte %i\n", basefile, *data_len); + + /* write out the (pathname_len) */ + in_len = strlen(basefile); + WRITE_BE_INT32(p, in_len); + fwrite(p, 1, 4, findex); + /* write out the pathname */ + fwrite(basefile, 1, in_len, findex); + /* write out the (data_offset) */ + WRITE_BE_INT32(p, *data_len); + fwrite(p, 1, 4, findex); + + *index_len += 4 + in_len + 4 + 4; + + /* now open the file, get (data_len), + * and append the file to the data file */ + fd = openat(dir_fd, filename, O_RDONLY|O_CLOEXEC); + if (fd < 0) { + open_fail: + warnp("could not open for reading: %s", filename); + fake_data_len: + WRITE_BE_INT32(p, 0); + fwrite(p, 1, 4, findex); + return; + } + fin = fdopen(fd, "r"); + if (!fin) { + close(fd); + goto open_fail; + } + in_len = st->st_size; + /* the xpak format can only store files whose size is a 32bit int + * so we have to make sure we don't store a big file */ + if (in_len != st->st_size) { + warnf("File is too big: %"PRIu64, (uint64_t)st->st_size); + fclose(fin); + goto fake_data_len; + } + WRITE_BE_INT32(p, in_len); + fwrite(p, 1, 4, findex); + copy_file(fin, fdata); + fclose(fin); + + *data_len += in_len; +} + +int +xpak_create( + int dir_fd, + const char *file, + int argc, + char **argv, + char append, + int verbose) +{ + FILE *findex, *fdata, *fout; + struct dirent **dir; + int i, fidx, numfiles; + struct stat st; + char path[_Q_PATH_MAX]; + unsigned char intbuf[4]; + unsigned char *p; + int index_len, data_len; + + if (argc == 0) + err("Create usage: <xpak output> <files/dirs to pack>"); + + if (strlen(file) >= sizeof(path)-6) + err("Pathname is too long: %s", file); + + if ((fout = fopen(file, append ? "a" : "w")) == NULL) { + warnp("could not open output: %s", file); + return 1; + } + strcpy(path, file); strcat(path, ".index"); + if ((findex = fopen(path, "w+")) == NULL) { + warnp("could not open output: %s", path); + fclose(fout); + return 1; + } + strcpy(path, file); strcat(path, ".dat"); + if ((fdata = fopen(path, "w+")) == NULL) { + warnp("could not open output: %s", path); + fclose(fout); + fclose(findex); + return 1; + } + + index_len = data_len = 0; + for (i = 0; i < argc; ++i) { + if (fstatat(dir_fd, argv[i], &st, 0)) { + warnp("fstatat(%s) failed", argv[i]); + continue; + } + if (S_ISDIR(st.st_mode)) { + if ((numfiles = + scandir(argv[i], &dir, filter_hidden, alphasort)) < 0) + warn("Directory '%s' is empty; skipping", argv[i]); + for (fidx = 0; fidx < numfiles; ++fidx) { + int ret = snprintf(path, sizeof(path), "%s/%s", + argv[i], dir[fidx]->d_name); + if (ret < 0 || (size_t)ret >= sizeof(path)) { + warn("skipping path too long: %s/%s", + argv[i], dir[fidx]->d_name); + continue; + } + if (stat(path, &st) < 0) { + warnp("could not read %s", path); + continue; + } + _xpak_add_file(dir_fd, path, &st, + findex, &index_len, fdata, &data_len, verbose); + } + scandir_free(dir, numfiles); + } else if (S_ISREG(st.st_mode)) { + _xpak_add_file(dir_fd, argv[i], &st, + findex, &index_len, fdata, &data_len, verbose); + } else + warn("Skipping non file/directory '%s'", argv[i]); + } + + rewind(findex); + rewind(fdata); + + /* "XPAKPACK" + (index_len) + (data_len) + index + data + "XPAKSTOP" */ + fwrite(XPAK_START_MSG, 1, XPAK_START_MSG_LEN, fout); /* "XPAKPACK" */ + p = intbuf; + WRITE_BE_INT32(p, index_len); + fwrite(p, 1, 4, fout); /* (index_len) */ + WRITE_BE_INT32(p, data_len); + fwrite(p, 1, 4, fout); /* (data_len) */ + copy_file(findex, fout); /* index */ + copy_file(fdata, fout); /* data */ + fwrite(XPAK_END_MSG, 1, XPAK_END_MSG_LEN, fout); /* "XPAKSTOP" */ + + strcpy(path, file); strcat(path, ".index"); unlink(path); + strcpy(path, file); strcat(path, ".dat"); unlink(path); + fclose(findex); + fclose(fdata); + fclose(fout); + + return 0; +} diff --git a/libq/xpak.h b/libq/xpak.h new file mode 100644 index 00000000..0b318b26 --- /dev/null +++ b/libq/xpak.h @@ -0,0 +1,31 @@ +/* + * Copyright 2005-2019 Gentoo Foundation + * Distributed under the terms of the GNU General Public License v2 + */ + +#ifndef _XPAK_H +#define _XPAK_H 1 + +typedef void (*xpak_callback_t)(int,char*,int,int,int,char*); + +int xpak_list( + int dir_fd, + const char *file, + int argc, + char **argv, + xpak_callback_t func); +int xpak_extract( + int dir_fd, + const char *file, + int argc, + char **argv, + xpak_callback_t func); +int xpak_create( + int dir_fd, + const char *file, + int argc, + char **argv, + char append, + int v); + +#endif diff --git a/libq/xregex.c b/libq/xregex.c index d299edd0..31512540 100644 --- a/libq/xregex.c +++ b/libq/xregex.c @@ -26,3 +26,20 @@ void xregcomp(regex_t *preg, const char *regex, int cflags) if (unlikely(wregcomp(preg, regex, cflags))) exit(EXIT_FAILURE); } + +int +rematch(const char *re, const char *match, int cflags) +{ + regex_t preg; + int ret; + + if ((match == NULL) || (re == NULL)) + return EXIT_FAILURE; + + if (wregcomp(&preg, re, cflags)) + return EXIT_FAILURE; + ret = regexec(&preg, match, 0, NULL, 0); + regfree(&preg); + + return ret; +} diff --git a/libq/xregex.h b/libq/xregex.h index fd75030e..59fc51b5 100644 --- a/libq/xregex.h +++ b/libq/xregex.h @@ -12,5 +12,6 @@ int wregcomp(regex_t *preg, const char *regex, int cflags); void xregcomp(regex_t *preg, const char *regex, int cflags); +int rematch(const char *, const char *, int); #endif @@ -8,9 +8,19 @@ */ #include "main.h" +#include "applets.h" + +#include <iniparser.h> +#include <xalloc.h> +#include <assert.h> +#include <ctype.h> +#include <sys/time.h> +#include <limits.h> + #include "atom.h" #include "basename.h" #include "busybox.h" +#include "cache.h" #include "colors.h" #include "copy_file.h" #include "eat_file.h" @@ -32,34 +42,6 @@ #include "xregex.h" #include "xsystem.h" -#include <iniparser.h> -#include <xalloc.h> -#include <assert.h> -#include <ctype.h> -#include <sys/time.h> -#include <limits.h> - -#if defined(__sun) && defined(__SVR4) -/* workaround non-const defined name in option struct, such that we - * don't get a zillion of warnings */ -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 -struct option { - const char *name; - int has_arg; - int *flag; - int val; -}; -extern int getopt_long(int, char * const *, const char *, - const struct option *, int *); -#else -# include <getopt.h> -#endif - -/* prototypes and such */ -static int lookup_applet_idx(const char *); - /* variables to control runtime behavior */ char *module_name = NULL; char *modpath = NULL; @@ -67,29 +49,26 @@ int verbose = 0; int quiet = 0; int portcachedir_type = 0; char pretend = 0; -static int reinitialize = 0; -static int reinitialize_metacache = 0; -static char *portlogdir; +char *portroot; +char *config_protect; +char *config_protect_mask; +char *portvdb; +char *portlogdir; +char *pkg_install_mask; +char *binhost; +char *pkgdir; +char *port_tmpdir; +char *features; +char *install_mask; +DECLARE_ARRAY(overlays); + static char *main_overlay; static char *portarch; -static char *portvdb; static char *portedb; const char portcachedir_pms[] = "metadata/cache"; const char portcachedir_md5[] = "metadata/md5-cache"; -static char *portroot; static char *eprefix; -static char *config_protect, *config_protect_mask; - -static char *pkgdir; -static char *port_tmpdir; - -static char *binhost; -static char *features; static char *accept_license; -static char *install_mask; -static char *pkg_install_mask; - -const char err_noapplet[] = "Sorry this applet was disabled at compile time"; /* helper functions for showing errors */ const char *argv0; @@ -108,9 +87,7 @@ init_coredumps(void) } #endif -static DECLARE_ARRAY(overlays); - -static void +void no_colors(void) { BOLD = NORM = BLUE = DKBLUE = CYAN = GREEN = DKGREEN = \ @@ -118,7 +95,7 @@ no_colors(void) setenv("NOCOLOR", "true", 1); } -static void +void setup_quiet(void) { /* "e" for FD_CLOEXEC */ @@ -127,38 +104,8 @@ setup_quiet(void) ++quiet; } -/* include common applet defs */ -#include "applets.h" - -/* Common usage for all applets */ -#define COMMON_FLAGS "vqChV" -#define COMMON_LONG_OPTS \ - {"root", a_argument, NULL, 0x1}, \ - {"verbose", no_argument, NULL, 'v'}, \ - {"quiet", no_argument, NULL, 'q'}, \ - {"nocolor", no_argument, NULL, 'C'}, \ - {"help", no_argument, NULL, 'h'}, \ - {"version", no_argument, NULL, 'V'}, \ - {NULL, no_argument, NULL, 0x0} -#define COMMON_OPTS_HELP \ - "Set the ROOT env var", \ - "Make a lot of noise", \ - "Tighter output; suppress warnings", \ - "Don't output color", \ - "Print this help and exit", \ - "Print version and exit", \ - NULL -#define COMMON_GETOPTS_CASES(applet) \ - case 0x1: portroot = optarg; break; \ - case 'v': ++verbose; break; \ - case 'q': setup_quiet(); break; \ - case 'V': version_barf(); break; \ - case 'h': applet ## _usage(EXIT_SUCCESS); break; \ - case 'C': no_colors(); break; \ - default: applet ## _usage(EXIT_FAILURE); break; - /* display usage and exit */ -static void +void usage(int status, const char *flags, struct option const opts[], const char * const help[], const char *desc, int blabber) { @@ -226,7 +173,7 @@ usage(int status, const char *flags, struct option const opts[], exit(status); } -static void +void version_barf(void) { const char *vcsid = ""; @@ -250,39 +197,7 @@ version_barf(void) exit(EXIT_SUCCESS); } -static bool -prompt(const char *p) -{ - printf("%s? [Y/n] ", p); - fflush(stdout); - switch (getc(stdin)) { - case '\n': - case 'y': - case 'Y': - return true; - default: - return false; - } -} - -int -rematch(const char *re, const char *match, int cflags) -{ - regex_t preg; - int ret; - - if ((match == NULL) || (re == NULL)) - return EXIT_FAILURE; - - if (wregcomp(&preg, re, cflags)) - return EXIT_FAILURE; - ret = regexec(&preg, match, 0, NULL, 0); - regfree(&preg); - - return ret; -} - -static void +void freeargv(int argc, char **argv) { while (argc--) @@ -290,7 +205,7 @@ freeargv(int argc, char **argv) free(argv); } -static void +void makeargv(const char *string, int *argc, char ***argv) { int curc = 2; @@ -320,96 +235,6 @@ makeargv(const char *string, int *argc, char ***argv) free(q); } -/* - * Parse a line of CONTENTS file and provide access to the individual fields - */ -typedef enum { - CONTENTS_DIR, CONTENTS_OBJ, CONTENTS_SYM -} contents_type; -typedef struct { - contents_type type; - char *_data; - char *name; - char *sym_target; - char *digest; - char *mtime_str; - long mtime; -} contents_entry; - -static contents_entry * -contents_parse_line(char *line) -{ - static contents_entry e; - char *p; - - if (!line || !*line || *line == '\n') - return NULL; - - /* chop trailing newline */ - if ((p = strrchr(line, '\n')) != NULL) - *p = '\0'; - - /* ferringb wants to break portage/vdb by using tabs vs spaces - * so filenames can have lame ass spaces in them.. - * (I smell Windows near by) - * Anyway we just convert that crap to a space so we can still - * parse quickly */ - p = line; - while ((p = strchr(p, '\t')) != NULL) - *p = ' '; - - memset(&e, 0x00, sizeof(e)); - e._data = line; - - if (!strncmp(e._data, "obj ", 4)) - e.type = CONTENTS_OBJ; - else if (!strncmp(e._data, "dir ", 4)) - e.type = CONTENTS_DIR; - else if (!strncmp(e._data, "sym ", 4)) - e.type = CONTENTS_SYM; - else - return NULL; - - e.name = e._data + 4; - - switch (e.type) { - /* dir /bin */ - case CONTENTS_DIR: - break; - - /* obj /bin/bash 62ed51c8b23866777552643ec57614b0 1120707577 */ - case CONTENTS_OBJ: - if ((e.mtime_str = strrchr(e.name, ' ')) == NULL) - return NULL; - *e.mtime_str++ = '\0'; - if ((e.digest = strrchr(e.name, ' ')) == NULL) - return NULL; - *e.digest++ = '\0'; - break; - - /* sym /bin/sh -> bash 1120707577 */ - case CONTENTS_SYM: - if ((e.mtime_str = strrchr(e.name, ' ')) == NULL) - return NULL; - *e.mtime_str++ = '\0'; - if ((e.sym_target = strstr(e.name, " -> ")) == NULL) - return NULL; - *e.sym_target = '\0'; - e.sym_target += 4; - break; - } - - if (e.mtime_str) { - e.mtime = strtol(e.mtime_str, NULL, 10); - if (e.mtime == LONG_MAX) { - e.mtime = 0; - e.mtime_str = NULL; - } - } - - return &e; -} - /* Handle a single file in the repos.conf format. */ static void read_one_repos_conf(const char *repos_conf) @@ -958,22 +783,7 @@ initialize_portage_env(void) color_remap(); } -enum { - CACHE_EBUILD = 1, - CACHE_METADATA = 2, - CACHE_METADATA_PMS = 10, - CACHE_METADATA_MD5 = 11, -}; - -static int -filter_hidden(const struct dirent *dentry) -{ - if (dentry->d_name[0] == '.') - return 0; - return 1; -} - -static const char * +const char * initialize_flat(const char *overlay, int cache_type, bool force) { struct dirent **category, **pn, **eb; @@ -1109,357 +919,6 @@ ret: return cache_file; } -static void -reinitialize_as_needed(void) -{ - size_t n; - const char *overlay, *ret = ret; - - if (reinitialize) - array_for_each(overlays, n, overlay) { - ret = initialize_flat(overlay, CACHE_EBUILD, true); - if (USE_CLEANUP) - free((void *)ret); - } - - if (reinitialize_metacache) - array_for_each(overlays, n, overlay) { - ret = initialize_flat(overlay, CACHE_METADATA, true); - if (USE_CLEANUP) - free((void *)ret); - } -} - -typedef struct { - char *_data; - char *DEPEND; /* line 1 */ - char *RDEPEND; - char *SLOT; - char *SRC_URI; - char *RESTRICT; /* line 5 */ - char *HOMEPAGE; - char *LICENSE; - char *DESCRIPTION; - char *KEYWORDS; - char *INHERITED; /* line 10 */ - char *IUSE; - char *CDEPEND; - char *PDEPEND; - char *PROVIDE; /* line 14 */ - char *EAPI; - char *PROPERTIES; - depend_atom *atom; - /* These are MD5-Cache only */ - char *DEFINED_PHASES; - char *REQUIRED_USE; - char *_eclasses_; - char *_md5_; -} portage_cache; - -static void cache_free(portage_cache *cache); -static portage_cache *cache_read_file_pms(const char *file); -static portage_cache *cache_read_file_md5(const char *file); - -static portage_cache * -cache_read_file(const char *file) -{ - if (portcachedir_type == CACHE_METADATA_MD5) - return(cache_read_file_md5(file)); - else if (portcachedir_type == CACHE_METADATA_PMS) - return(cache_read_file_pms(file)); - warn("Unknown metadata cache type!"); - return NULL; -} - -static portage_cache * -cache_read_file_pms(const char *file) -{ - struct stat s; - char *ptr; - FILE *f; - portage_cache *ret = NULL; - size_t len; - - if ((f = fopen(file, "r")) == NULL) - goto err; - - if (fstat(fileno(f), &s) != 0) - goto err; - len = sizeof(*ret) + s.st_size + 1; - ret = xzalloc(len); - ptr = (char*)ret; - ret->_data = ptr + sizeof(*ret); - if ((off_t)fread(ret->_data, 1, s.st_size, f) != s.st_size) - goto err; - - ret->atom = atom_explode(file); - ret->DEPEND = ret->_data; -#define next_line(curr, next) \ - if ((ptr = strchr(ret->curr, '\n')) == NULL) { \ - warn("Invalid cache file '%s'", file); \ - goto err; \ - } \ - ret->next = ptr+1; \ - *ptr = '\0'; - next_line(DEPEND, RDEPEND) - next_line(RDEPEND, SLOT) - next_line(SLOT, SRC_URI) - next_line(SRC_URI, RESTRICT) - next_line(RESTRICT, HOMEPAGE) - next_line(HOMEPAGE, LICENSE) - next_line(LICENSE, DESCRIPTION) - next_line(DESCRIPTION, KEYWORDS) - next_line(KEYWORDS, INHERITED) - next_line(INHERITED, IUSE) - next_line(IUSE, CDEPEND) - next_line(CDEPEND, PDEPEND) - next_line(PDEPEND, PROVIDE) - next_line(PROVIDE, EAPI) - next_line(EAPI, PROPERTIES) -#undef next_line - ptr = strchr(ptr+1, '\n'); - if (ptr == NULL) { - warn("Invalid cache file '%s' - could not find end of cache data", file); - goto err; - } - *ptr = '\0'; - - fclose(f); - - return ret; - -err: - if (f) fclose(f); - if (ret) cache_free(ret); - return NULL; -} - -static portage_cache * -cache_read_file_md5(const char *file) -{ - struct stat s; - char *ptr, *endptr; - FILE *f; - portage_cache *ret = NULL; - size_t len; - - if ((f = fopen(file, "r")) == NULL) - goto err; - - if (fstat(fileno(f), &s) != 0) - goto err; - len = sizeof(*ret) + s.st_size + 1; - ret = xzalloc(len); - ptr = (char*)ret; - ret->_data = ptr + sizeof(*ret); - if ((off_t)fread(ret->_data, 1, s.st_size, f) != s.st_size) - goto err; - - ret->atom = atom_explode(file); - - /* We have a block of key=value\n data. - * KEY=VALUE\n - * Where KEY does NOT contain: - * \0 \n = - * And VALUE does NOT contain: - * \0 \n - * */ -#define assign_var_cmp(keyname, cmpkey) \ - if (strncmp(keyptr, cmpkey, strlen(cmpkey)) == 0) { \ - ret->keyname = valptr; \ - continue; \ - } -#define assign_var(keyname) \ - assign_var_cmp(keyname, #keyname); - - ptr = ret->_data; - endptr = strchr(ptr, '\0'); - if (endptr == NULL) { - warn("Invalid cache file '%s' - could not find end of cache data", file); - goto err; - } - - while (ptr != NULL && ptr != endptr) { - char *keyptr; - char *valptr; - keyptr = ptr; - valptr = strchr(ptr, '='); - if (valptr == NULL) { - warn("Invalid cache file '%s' val", file); - goto err; - } - *valptr = '\0'; - valptr++; - ptr = strchr(valptr, '\n'); - if (ptr == NULL) { - warn("Invalid cache file '%s' key", file); - goto err; - } - *ptr = '\0'; - ptr++; - - assign_var(CDEPEND); - assign_var(DEPEND); - assign_var(DESCRIPTION); - assign_var(EAPI); - assign_var(HOMEPAGE); - assign_var(INHERITED); - assign_var(IUSE); - assign_var(KEYWORDS); - assign_var(LICENSE); - assign_var(PDEPEND); - assign_var(PROPERTIES); - assign_var(PROVIDE); - assign_var(RDEPEND); - assign_var(RESTRICT); - assign_var(SLOT); - assign_var(SRC_URI); - assign_var(DEFINED_PHASES); - assign_var(REQUIRED_USE); - assign_var(_eclasses_); - assign_var(_md5_); - warn("Cache file '%s' with unknown key %s", file, keyptr); - } -#undef assign_var -#undef assign_var_cmp - - fclose(f); - - return ret; - -err: - if (f) fclose(f); - if (ret) cache_free(ret); - return NULL; -} - -#ifdef EBUG -static void -cache_dump(portage_cache *cache) -{ - if (!cache) - errf("Cache is empty !"); - - printf("DEPEND : %s\n", cache->DEPEND); - printf("RDEPEND : %s\n", cache->RDEPEND); - printf("SLOT : %s\n", cache->SLOT); - printf("SRC_URI : %s\n", cache->SRC_URI); - printf("RESTRICT : %s\n", cache->RESTRICT); - printf("HOMEPAGE : %s\n", cache->HOMEPAGE); - printf("LICENSE : %s\n", cache->LICENSE); - printf("DESCRIPTION: %s\n", cache->DESCRIPTION); - printf("KEYWORDS : %s\n", cache->KEYWORDS); - printf("INHERITED : %s\n", cache->INHERITED); - printf("IUSE : %s\n", cache->IUSE); - printf("CDEPEND : %s\n", cache->CDEPEND); - printf("PDEPEND : %s\n", cache->PDEPEND); - printf("PROVIDE : %s\n", cache->PROVIDE); - printf("EAPI : %s\n", cache->EAPI); - printf("PROPERTIES : %s\n", cache->PROPERTIES); - if (!cache->atom) return; - printf("CATEGORY : %s\n", cache->atom->CATEGORY); - printf("PN : %s\n", cache->atom->PN); - printf("PV : %s\n", cache->atom->PV); - printf("PVR : %s\n", cache->atom->PVR); -} -#endif - -static void -cache_free(portage_cache *cache) -{ - if (!cache) - errf("Cache is empty !"); - atom_implode(cache->atom); - free(cache); -} - -static char * -atom_to_pvr(depend_atom *atom) { - return (atom->PR_int == 0 ? atom->P : atom->PVR ); -} - -/* TODO: Merge this into libq/vdb.c somehow. */ -static set * -get_vdb_atoms(int fullcpv) -{ - q_vdb_ctx *ctx; - - int cfd, j; - int dfd, i; - - char buf[_Q_PATH_MAX]; - char slot[_Q_PATH_MAX]; - char *slotp = slot; - size_t slot_len; - - struct dirent **cat; - struct dirent **pf; - - depend_atom *atom = NULL; - set *cpf = NULL; - - ctx = q_vdb_open(portroot, portvdb); - if (!ctx) - return NULL; - - /* scan the cat first */ - cfd = scandirat(ctx->vdb_fd, ".", &cat, q_vdb_filter_cat, alphasort); - if (cfd < 0) - goto fuckit; - - for (j = 0; j < cfd; j++) { - dfd = scandirat(ctx->vdb_fd, cat[j]->d_name, - &pf, q_vdb_filter_pkg, alphasort); - if (dfd < 0) - continue; - for (i = 0; i < dfd; i++) { - int blen = snprintf(buf, sizeof(buf), "%s/%s/SLOT", - cat[j]->d_name, pf[i]->d_name); - if (blen < 0 || (size_t)blen >= sizeof(buf)) { - warnf("unable to parse long package: %s/%s", - cat[j]->d_name, pf[i]->d_name); - continue; - } - - /* Chop the SLOT for the atom parsing. */ - buf[blen - 5] = '\0'; - if ((atom = atom_explode(buf)) == NULL) - continue; - /* Restore the SLOT. */ - buf[blen - 5] = '/'; - - slot_len = sizeof(slot); - eat_file_at(ctx->vdb_fd, buf, &slotp, &slot_len); - rmspace(slot); - - if (fullcpv) { - if (atom->PR_int) - snprintf(buf, sizeof(buf), "%s/%s-%s-r%i", - atom->CATEGORY, atom->PN, atom->PV, atom->PR_int); - else - snprintf(buf, sizeof(buf), "%s/%s-%s", - atom->CATEGORY, atom->PN, atom->PV); - } else { - snprintf(buf, sizeof(buf), "%s/%s", atom->CATEGORY, atom->PN); - } - atom_implode(atom); - cpf = add_set(buf, cpf); - } - scandir_free(pf, dfd); - } - scandir_free(cat, cfd); - - fuckit: - q_vdb_close(ctx); - return cpf; -} - -static void -cleanup(void) -{ - reinitialize_as_needed(); -} - int main(int argc, char **argv) { struct stat st; @@ -1478,9 +937,6 @@ int main(int argc, char **argv) no_colors(); initialize_portage_env(); - atexit(cleanup); optind = 0; return q_main(argc, argv); } - -#include "include_applets.h" @@ -52,6 +52,16 @@ extern const char *argv0; # define MAX(x, y) ((x) < (y) ? (y) : (x)) #endif +#define READ_BE_INT32(P) \ + (((P)[0] << 24) | ((P)[1] << 16) | ((P)[2] << 8 ) | (P)[3]) +#define WRITE_BE_INT32(P,I) \ +{ \ + (P)[0] = (I & 0xff000000) >> 24; \ + (P)[1] = (I & 0x00ff0000) >> 16; \ + (P)[2] = (I & 0x0000ff00) >> 8; \ + (P)[3] = (I & 0x000000ff); \ +} + /* Easy enough to glue to older versions */ #ifndef O_CLOEXEC # define O_CLOEXEC 0 @@ -122,6 +132,4 @@ extern FILE *warnout; #define errp(fmt, args...) _err(warnp, fmt , ## args) #define errfp(fmt, args...) _err(warnfp, fmt, ## args) -int rematch(const char *, const char *, int); - #endif @@ -7,6 +7,17 @@ * Copyright 2017- Fabian Groffen - <grobian@gentoo.org> */ +#include "main.h" +#include "applets.h" + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +#include "atom.h" +#include "basename.h" +#include "cache.h" + #define Q_FLAGS "irmM:" COMMON_FLAGS static struct option const q_long_opts[] = { {"install", no_argument, NULL, 'i'}, @@ -24,7 +35,7 @@ static const char * const q_opts_help[] = { }; #define q_usage(ret) usage(ret, Q_FLAGS, q_long_opts, q_opts_help, NULL, lookup_applet_idx("q")) -static APPLET lookup_applet(const char *applet) +APPLET lookup_applet(const char *applet) { unsigned int i; @@ -34,7 +45,8 @@ static APPLET lookup_applet(const char *applet) for (i = 0; applets[i].name; ++i) { if (strcmp(applets[i].name, applet) == 0) { argv0 = applets[i].name; - if (i && applets[i].desc != NULL) ++argv0; /* chop the leading 'q' */ + if (i && applets[i].desc != NULL) + ++argv0; /* chop the leading 'q' */ return applets[i].func; } } @@ -60,11 +72,34 @@ int lookup_applet_idx(const char *applet) return 0; } +static void +reinitialize_as_needed(int reinitialize, int reinitialize_metacache) +{ + size_t n; + const char *overlay, *ret = ret; + + if (reinitialize) + array_for_each(overlays, n, overlay) { + ret = initialize_flat(overlay, CACHE_EBUILD, true); + if (USE_CLEANUP) + free((void *)ret); + } + + if (reinitialize_metacache) + array_for_each(overlays, n, overlay) { + ret = initialize_flat(overlay, CACHE_METADATA, true); + if (USE_CLEANUP) + free((void *)ret); + } +} + int q_main(int argc, char **argv) { int i, install; const char *p; APPLET func; + int reinitialize_metacache = 0; + int reinitialize = 0; if (argc == 0) return 1; @@ -161,8 +196,10 @@ int q_main(int argc, char **argv) return ret; } - if (reinitialize > 0 || reinitialize_metacache > 0) + if (reinitialize > 0 || reinitialize_metacache > 0) { + reinitialize_as_needed(reinitialize, reinitialize_metacache); return 0; + } if (reinitialize < 0 || reinitialize_metacache < 0) { reinitialize = reinitialize_metacache = 0; return 0; @@ -1,12 +1,18 @@ /* - * Copyright 2005-2018 Gentoo Foundation + * Copyright 2005-2019 Gentoo Foundation * Distributed under the terms of the GNU General Public License v2 * * Copyright 2005-2008 Ned Ludd - <solar@gentoo.org> * Copyright 2005-2014 Mike Frysinger - <vapier@gentoo.org> */ -#ifdef APPLET_qatom +#include "main.h" + +#include <stdlib.h> +#include <stdbool.h> + +#include "atom.h" +#include "applets.h" #define QATOM_FORMAT "%{CATEGORY} %{PN} %{PV} %[PR] %[SLOT] %[pfx] %[sfx]" @@ -148,7 +154,3 @@ int qatom_main(int argc, char **argv) return EXIT_SUCCESS; } - -#else -DEFINE_APPLET_STUB(qatom) -#endif @@ -5,7 +5,23 @@ * Copyright 2006 Thomas A. Cort - <tcort@gentoo.org> */ -#ifdef APPLET_qcache +#include "main.h" +#include "applets.h" + +#include <stdio.h> +#include <string.h> +#include <strings.h> +#include <xalloc.h> +#include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> + +#include "atom.h" +#include "cache.h" +#include "scandirat.h" +#include "rmspace.h" +#include "set.h" +#include "xasprintf.h" /********************************************************************/ /* Required portage-utils stuff */ @@ -358,7 +374,9 @@ qcache_vercmp(const struct dirent **x, const struct dirent **y) static int qcache_file_select(const struct dirent *entry) { - return !(entry->d_name[0] == '.' || (strcmp(entry->d_name, "metadata.xml") == 0) || (strstr(entry->d_name, ".cpickle") != 0)); + return !(entry->d_name[0] == '.' || + (strcmp(entry->d_name, "metadata.xml") == 0) || + (strstr(entry->d_name, ".cpickle") != 0)); } /* @@ -374,7 +392,8 @@ qcache_file_select(const struct dirent *entry) static int qcache_ebuild_select(const struct dirent *entry) { - return ((strlen(entry->d_name) > 7) && !strcmp(entry->d_name+strlen(entry->d_name)-7, ".ebuild")); + return ((strlen(entry->d_name) > 7) && + !strcmp(entry->d_name+strlen(entry->d_name)-7, ".ebuild")); } /********************************************************************/ @@ -594,10 +613,13 @@ qcache_not(qcache_data *data) return; } - if (keywords[qcache_test_arch] == testing || keywords[qcache_test_arch] == stable) { + if (keywords[qcache_test_arch] == testing || + keywords[qcache_test_arch] == stable) + { qcache_skip = 1; } else if (data->cur == data->num) { - printf("%s%s/%s%s%s\n", BOLD, data->category, BLUE, data->package, NORM); + printf("%s%s/%s%s%s\n", BOLD, data->category, BLUE, + data->package, NORM); } free(keywords); @@ -621,9 +643,12 @@ qcache_all(qcache_data *data) return; } - if (keywords[qcache_test_arch] == stable || keywords[qcache_test_arch] == testing) { + if (keywords[qcache_test_arch] == stable || + keywords[qcache_test_arch] == testing) + { qcache_skip = 1; - printf("%s%s/%s%s%s\n", BOLD, data->category, BLUE, data->package, NORM); + printf("%s%s/%s%s%s\n", BOLD, data->category, BLUE, + data->package, NORM); } free(keywords); @@ -651,11 +676,14 @@ qcache_dropped(qcache_data *data) return; } - if (keywords[qcache_test_arch] == testing || keywords[qcache_test_arch] == stable) { + if (keywords[qcache_test_arch] == testing || + keywords[qcache_test_arch] == stable) + { qcache_skip = 1; if (possible) { - printf("%s%s/%s%s%s\n", BOLD, data->category, BLUE, data->package, NORM); + printf("%s%s/%s%s%s\n", BOLD, data->category, BLUE, + data->package, NORM); } free(keywords); @@ -889,7 +917,8 @@ qcache_testing_only(qcache_data *data) possible = 1; if (data->cur == data->num && possible) { - printf("%s%s/%s%s%s\n", BOLD, data->category, BLUE, data->package, NORM); + printf("%s%s/%s%s%s\n", BOLD, data->category, BLUE, + data->package, NORM); } free(keywords); @@ -972,7 +1001,8 @@ int qcache_main(int argc, char **argv) case 'a': case 'n': if (action) - qcache_usage(EXIT_FAILURE); /* trying to use more than 1 action */ + qcache_usage(EXIT_FAILURE); + /* trying to use more than 1 action */ action = i; break; @@ -999,7 +1029,3 @@ int qcache_main(int argc, char **argv) qcache_usage(EXIT_FAILURE); return EXIT_FAILURE; } - -#else -DEFINE_APPLET_STUB(qcache) -#endif @@ -7,9 +7,23 @@ * Copyright 2018- Fabian Groffen - <grobian@gentoo.org> */ -#ifdef APPLET_qcheck +#include "main.h" +#include "applets.h" +#include <sys/types.h> #include <inttypes.h> +#include <sys/stat.h> +#include <fcntl.h> + +#include "atom.h" +#include "contents.h" +#include "md5_sha1_sum.h" +#include "prelink.h" +#include "set.h" +#include "vdb.h" +#include "xarray.h" +#include "xasprintf.h" +#include "xregex.h" #define QCHECK_FLAGS "s:uABHTPp" COMMON_FLAGS static struct option const qcheck_long_opts[] = { @@ -437,7 +451,3 @@ int qcheck_main(int argc, char **argv) xarrayfree_int(atoms); return ret; } - -#else -DEFINE_APPLET_STUB(qcheck) -#endif @@ -7,7 +7,19 @@ * Copyright 2018- Fabian Groffen - <grobian@gentoo.org> */ -#ifdef APPLET_qdepends +#include "main.h" +#include "applets.h" + +#include <ctype.h> +#include <xalloc.h> +#include <assert.h> + +#include "atom.h" +#include "set.h" +#include "vdb.h" +#include "xarray.h" +#include "xasprintf.h" +#include "xregex.h" #define QDEPENDS_FLAGS "drpbafNk:Q:" COMMON_FLAGS static struct option const qdepends_long_opts[] = { @@ -714,7 +726,3 @@ int qdepends_main(int argc, char **argv) warn("no matches found for your query"); return ret ? EXIT_SUCCESS : EXIT_FAILURE; } - -#else -DEFINE_APPLET_STUB(qdepends) -#endif @@ -1,12 +1,24 @@ /* - * Copyright 2005-2018 Gentoo Foundation + * Copyright 2005-2019 Gentoo Foundation * Distributed under the terms of the GNU General Public License v2 * * Copyright 2005-2010 Ned Ludd - <solar@gentoo.org> * Copyright 2005-2014 Mike Frysinger - <vapier@gentoo.org> + * Copyright 2018- Fabian Groffen - <grobian@gentoo.org> */ -#ifdef APPLET_qfile +#include "main.h" +#include "applets.h" + +#include <xalloc.h> +#include <sys/types.h> +#include <fcntl.h> + +#include "atom.h" +#include "basename.h" +#include "contents.h" +#include "rmspace.h" +#include "vdb.h" #define QFILE_FLAGS "boRx:S" COMMON_FLAGS static struct option const qfile_long_opts[] = { @@ -499,7 +511,3 @@ int qfile_main(int argc, char **argv) return (found ? EXIT_SUCCESS : EXIT_FAILURE); } - -#else -DEFINE_APPLET_STUB(qfile) -#endif @@ -8,7 +8,22 @@ * Copyright 2018- Fabian Groffen - <grobian@gentoo.org> */ -#ifdef APPLET_qgrep +#include "main.h" +#include "applets.h" + +#include <stdio.h> +#include <xalloc.h> +#include <dirent.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +#include "atom.h" +#include "cache.h" +#include "vdb.h" +#include "xarray.h" +#include "xchdir.h" +#include "xregex.h" #define QGREP_FLAGS "IiHNclLexJEsS:B:A:" COMMON_FLAGS static struct option const qgrep_long_opts[] = { @@ -314,7 +329,8 @@ int qgrep_main(int argc, char **argv) } if (show_name && show_filename) { - warn("--with-name and --with-filename are incompatible options. The former wins."); + warn("--with-name and --with-filename are incompatible options. " + "The former wins."); show_filename = 0; } @@ -341,14 +357,16 @@ int qgrep_main(int argc, char **argv) } if (do_installed && do_eclass) { - warn("--installed and --eclass are incompatible options. The former wins."); + warn("--installed and --eclass are incompatible options. " + "The former wins."); do_eclass = 0; } /* do we report results once per file or per line ? */ per_file_output = do_count || (do_list && (!verbose || invert_list)); /* label for prefixing matching lines or listing matching files */ - label = (show_name ? name : ((verbose || show_filename || do_list) ? ebuild : NULL)); + label = (show_name ? name : + ((verbose || show_filename || do_list) ? ebuild : NULL)); if (argc > (optind + 1)) { include_atoms = xcalloc(sizeof(depend_atom*), (argc - optind - 1)); @@ -392,16 +410,20 @@ int qgrep_main(int argc, char **argv) snprintf(buf, sizeof(buf), "%s/%s", portroot, portvdb); xchdir(buf); if ((vdb_dir = opendir(".")) == NULL) - errp("could not opendir(%s/%s) for ROOT/VDB", portroot, portvdb); + errp("could not opendir(%s/%s) for ROOT/VDB", + portroot, portvdb); } /* iteration is either over ebuilds or eclasses */ while (do_eclass ? ((dentry = readdir(eclass_dir)) - && snprintf(ebuild, sizeof(ebuild), "eclass/%s", dentry->d_name)) + && snprintf(ebuild, sizeof(ebuild), + "eclass/%s", dentry->d_name)) : (do_installed - ? (get_next_installed_ebuild(ebuild, vdb_dir, &dentry, &cat_dir) != NULL) - : (fgets(ebuild, sizeof(ebuild), fp) != NULL))) { + ? (get_next_installed_ebuild(ebuild, vdb_dir, + &dentry, &cat_dir) != NULL) + : (fgets(ebuild, sizeof(ebuild), fp) != NULL))) + { FILE *newfp; /* filter badly named files, prepare eclass or package name, etc. */ @@ -451,14 +473,19 @@ int qgrep_main(int argc, char **argv) int lineno = 0; char remaining_after_context = 0; count = 0; - /* if there have been some matches already, then a separator will be needed */ - need_separator = (!status) && (num_lines_before || num_lines_after); - /* whatever is in the circular buffers list is no more a valid context */ + /* if there have been some matches already, then a + * separator will be needed */ + need_separator = + !status && (num_lines_before || num_lines_after); + /* whatever is in the circular buffers list is no more a + * valid context */ qgrep_buf_list_invalidate(buf_list); - /* reading a new line always happen in the next buffer of the list */ - while ((buf_list = buf_list->next) - && (fgets(buf_list->buf, sizeof(buf_list->buf), newfp)) != NULL) { + /* reading a new line always happen in the next buffer + * of the list */ + while ((buf_list = buf_list->next) && + fgets(buf_list->buf, sizeof(buf_list->buf), newfp)) + { lineno++; buf_list->valid = 1; @@ -477,17 +504,20 @@ int qgrep_main(int argc, char **argv) } if (skip_pattern) { - /* reject some other lines which match an optional pattern */ + /* reject some other lines which match an + * optional pattern */ if (!do_regex) { if (strfunc(buf_list->buf, skip_pattern) != NULL) goto print_after_context; } else { - if (regexec(&skip_preg, buf_list->buf, 0, NULL, 0) == 0) + if (regexec(&skip_preg, buf_list->buf, + 0, NULL, 0) == 0) goto print_after_context; } } - /* four ways to match a line (with/without inversion and regexp) */ + /* four ways to match a line (with/without inversion + * and regexp) */ if (!invert_match) { if (do_regex == 0) { if (strfunc(buf_list->buf, argv[optind]) == NULL) @@ -509,7 +539,8 @@ int qgrep_main(int argc, char **argv) count++; status = 0; /* got a match, exit status should be 0 */ if (per_file_output) - continue; /* matching files are listed out of this loop */ + continue; + /* matching files are listed out of this loop */ if ((need_separator > 0) && (num_lines_before || num_lines_after)) @@ -519,7 +550,8 @@ int qgrep_main(int argc, char **argv) need_separator = 0 - num_lines_before; if (!do_list) { /* print the leading context */ - qgrep_print_before_context(buf_list, num_lines_before, label, + qgrep_print_before_context(buf_list, + num_lines_before, label, ((verbose > 1) ? lineno : -1)); /* print matching line */ if (invert_match || *RED == '\0') @@ -530,9 +562,11 @@ int qgrep_main(int argc, char **argv) ((verbose > 1) ? lineno : -1), &preg); else qgrep_print_matching_line_strcolor(buf_list, label, - ((verbose > 1) ? lineno : -1), strfunc, argv[optind]); + ((verbose > 1) ? lineno : -1), strfunc, + argv[optind]); } else { - /* in verbose do_list mode, list the file once per match */ + /* in verbose do_list mode, list the file once + * per match */ printf("%s", label); if (verbose > 1) printf(":%d", lineno); @@ -546,8 +580,9 @@ int qgrep_main(int argc, char **argv) /* print some trailing context lines when needed */ if (!remaining_after_context) { if (!status) - /* we're getting closer to the need of a separator between - * current match block and the next one */ + /* we're getting closer to the need of a + * separator between current match block and + * the next one */ ++need_separator; } else { qgrep_print_context_line(buf_list, label, @@ -557,7 +592,8 @@ int qgrep_main(int argc, char **argv) } fclose(newfp); if (!per_file_output) - continue; /* matches were already displayed, line per line */ + continue; + /* matches were already displayed, line per line */ if (do_count && count) { if (label != NULL) /* -c without -v/-N/-H only outputs @@ -565,7 +601,8 @@ int qgrep_main(int argc, char **argv) printf("%s:", label); printf("%d\n", count); } else if ((count && !invert_list) || (!count && invert_list)) - printf("%s\n", label); /* do_list == 1, or we wouldn't be here */ + printf("%s\n", label); + /* do_list == 1, or we wouldn't be here */ } } if (do_eclass) @@ -591,7 +628,3 @@ int qgrep_main(int argc, char **argv) return status; } - -#else -DEFINE_APPLET_STUB(qgrep) -#endif @@ -8,7 +8,18 @@ * Copyright 2018- Fabian Groffen - <grobian@gentoo.org> */ -#ifdef APPLET_qlist +#include "main.h" +#include "applets.h" + +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <xalloc.h> + +#include "atom.h" +#include "contents.h" +#include "vdb.h" +#include "xregex.h" #define QLIST_FLAGS "ISRUcDeados" COMMON_FLAGS static struct option const qlist_long_opts[] = { @@ -163,8 +174,19 @@ umapstr(char display, q_vdb_pkg_ctx *pkg_ctx) return _umapstr_buf; } -static bool -qlist_match(q_vdb_pkg_ctx *pkg_ctx, const char *name, depend_atom **name_atom, bool exact) +/* forward declaration necessary for misuse from qmerge.c, see HACK there */ +bool +qlist_match( + q_vdb_pkg_ctx *pkg_ctx, + const char *name, + depend_atom **name_atom, + bool exact); +bool +qlist_match( + q_vdb_pkg_ctx *pkg_ctx, + const char *name, + depend_atom **name_atom, + bool exact) { const char *catname = pkg_ctx->cat_ctx->name; const char *pkgname = pkg_ctx->name; @@ -182,7 +204,8 @@ qlist_match(q_vdb_pkg_ctx *pkg_ctx, const char *name, depend_atom **name_atom, b uslot = NULL; else { if (!pkg_ctx->slot) - q_vdb_pkg_eat(pkg_ctx, "SLOT", &pkg_ctx->slot, &pkg_ctx->slot_len); + q_vdb_pkg_eat(pkg_ctx, "SLOT", &pkg_ctx->slot, + &pkg_ctx->slot_len); uslot_len = strlen(uslot); } } @@ -190,7 +213,8 @@ qlist_match(q_vdb_pkg_ctx *pkg_ctx, const char *name, depend_atom **name_atom, b urepo = strstr(name, "::"); if (urepo) { if (!pkg_ctx->repo) - q_vdb_pkg_eat(pkg_ctx, "repository", &pkg_ctx->repo, &pkg_ctx->repo_len); + q_vdb_pkg_eat(pkg_ctx, "repository", &pkg_ctx->repo, + &pkg_ctx->repo_len); urepo += 2; urepo_len = strlen(urepo); @@ -229,8 +253,8 @@ qlist_match(q_vdb_pkg_ctx *pkg_ctx, const char *name, depend_atom **name_atom, b } if (uslot) { - /* Require exact match on SLOTs. If the user didn't include a subslot, - * then ignore it when checking the package's value. */ + /* Require exact match on SLOTs. If the user didn't include a + * subslot, then ignore it when checking the package's value. */ if (strncmp(pkg_ctx->slot, uslot, uslot_len) != 0 || (pkg_ctx->slot[uslot_len] != '\0' && pkg_ctx->slot[uslot_len] != '/')) @@ -474,7 +498,3 @@ int qlist_main(int argc, char **argv) /* The return value is whether we matched anything. */ return ret ? EXIT_SUCCESS : EXIT_FAILURE; } - -#else -DEFINE_APPLET_STUB(qlist) -#endif @@ -7,7 +7,19 @@ * Copyright 2018- Fabian Groffen - <grobian@gentoo.org> */ -#ifdef APPLET_qlop +#include "main.h" +#include "applets.h" + +#include <string.h> +#include <time.h> +#include <stdio.h> +#include <stdlib.h> +#include <ctype.h> + +#include "atom.h" +#include "eat_file.h" +#include "xarray.h" +#include "xasprintf.h" #define QLOP_DEFAULT_LOGFILE "emerge.log" @@ -1009,7 +1021,3 @@ int qlop_main(int argc, char **argv) return EXIT_SUCCESS; } - -#else -DEFINE_APPLET_STUB(qlop) -#endif @@ -7,13 +7,35 @@ * Copyright 2018- Fabian Groffen - <grobian@gentoo.org> */ -#ifdef APPLET_qmerge +#include "main.h" +#include "applets.h" +#include <stdio.h> +#include <xalloc.h> #include <fnmatch.h> +#include <dirent.h> +#include <string.h> #include <sys/types.h> #include <sys/wait.h> +#include <assert.h> #include "stat-time.h" +#include "atom.h" +#include "copy_file.h" +#include "contents.h" +#include "eat_file.h" +#include "human_readable.h" +#include "md5_sha1_sum.h" +#include "profile.h" +#include "rmspace.h" +#include "scandirat.h" +#include "set.h" +#include "vdb.h" +#include "xasprintf.h" +#include "xchdir.h" +#include "xmkdir.h" +#include "xsystem.h" + #ifndef GLOB_BRACE # define GLOB_BRACE (1 << 10) /* Expand "{a,b}" to "a" "b". */ #endif @@ -100,6 +122,21 @@ static int pkg_unmerge(q_vdb_pkg_ctx *, set *, int, char **, int, char **); static struct pkg_t *grab_binpkg_info(const char *); static char *find_binpkg(const char *); +static bool +prompt(const char *p) +{ + printf("%s? [Y/n] ", p); + fflush(stdout); + switch (getc(stdin)) { + case '\n': + case 'y': + case 'Y': + return true; + default: + return false; + } +} + static int run_applet_l(const char *arg, ...) { int (*applet)(int, char **); @@ -251,6 +288,15 @@ qmerge_filter_cat(q_vdb_cat_ctx *cat_ctx, void *priv) return !state->catname || strcmp(cat_ctx->name, state->catname) == 0; } +/* HACK: pull this in, knowing that qlist will be in the final link, we + * should however figure out how to do what match does here from e.g. + * atom */ +extern bool qlist_match( + q_vdb_pkg_ctx *pkg_ctx, + const char *name, + depend_atom **name_atom, + bool exact); + static int qmerge_best_version_cb(q_vdb_pkg_ctx *pkg_ctx, void *priv) { @@ -2269,7 +2315,7 @@ qmerge_add_set(char *buf, set *q) if (strcmp(buf, "world") == 0) return qmerge_add_set_file("/var/lib/portage", "world", q); else if (strcmp(buf, "all") == 0) - return get_vdb_atoms(0); + return get_vdb_atoms(portroot, portvdb, 0); else if (strcmp(buf, "system") == 0) return q_profile_walk("packages", qmerge_add_set_system, q); else if (buf[0] == '@') @@ -2362,7 +2408,3 @@ int qmerge_main(int argc, char **argv) free_set(todo); return ret; } - -#else -DEFINE_APPLET_STUB(qmerge) -#endif @@ -7,9 +7,30 @@ * Copyright 2018- Fabian Groffen - <grobian@gentoo.org> */ -#ifdef APPLET_qpkg +#include "main.h" +#include "applets.h" +#include <stdio.h> +#include <string.h> #include <fnmatch.h> +#include <dirent.h> +#include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> + +#include "atom.h" +#include "basename.h" +#include "cache.h" +#include "contents.h" +#include "human_readable.h" +#include "md5_sha1_sum.h" +#include "scandirat.h" +#include "set.h" +#include "vdb.h" +#include "xarray.h" +#include "xasprintf.h" +#include "xchdir.h" +#include "xpak.h" #define QPKG_FLAGS "cEpP:" COMMON_FLAGS static struct option const qpkg_long_opts[] = { @@ -33,6 +54,11 @@ extern char pretend; static char *qpkg_bindir = NULL; static int eclean = 0; +static char * +atom_to_pvr(depend_atom *atom) { + return (atom->PR_int == 0 ? atom->P : atom->PVR ); +} + /* checks to make sure this is a .tbz2 file. used by scandir() */ static int filter_tbz2(const struct dirent *dentry) @@ -114,7 +140,7 @@ qpkg_clean(char *dirp) if ((count = scandir(".", &dnames, filter_hidden, alphasort)) < 0) return 1; - vdb = get_vdb_atoms(1); + vdb = get_vdb_atoms(portroot, portvdb, 1); if (eclean) { size_t n; @@ -222,7 +248,6 @@ qpkg_make(depend_atom *atom) FILE *fp, *out; char tmpdir[BUFSIZE]; char filelist[BUFSIZE + 32]; - char xpak[BUFSIZE + 32]; char tbz2[BUFSIZE + 32]; size_t buflen; char *buf; @@ -231,7 +256,8 @@ qpkg_make(depend_atom *atom) struct stat st; if (pretend) { - printf(" %s-%s %s/%s:\n", GREEN, NORM, atom->CATEGORY, atom_to_pvr(atom)); + printf(" %s-%s %s/%s:\n", + GREEN, NORM, atom->CATEGORY, atom_to_pvr(atom)); return 0; } @@ -240,20 +266,28 @@ qpkg_make(depend_atom *atom) snprintf(buf, buflen, "%s/%s/%s/CONTENTS", portvdb, atom->CATEGORY, atom_to_pvr(atom)); - if ((fp = fopen(buf, "r")) == NULL) + if ((fp = fopen(buf, "r")) == NULL) { + free(buf); return -1; + } snprintf(tmpdir, sizeof(tmpdir), "%s/qpkg.XXXXXX", qpkg_get_bindir()); - if ((i = mkstemp(tmpdir)) == -1) + if ((i = mkstemp(tmpdir)) == -1) { + free(buf); return -2; + } close(i); unlink(tmpdir); - if (mkdir(tmpdir, 0750)) + if (mkdir(tmpdir, 0750)) { + free(buf); return -3; + } snprintf(filelist, sizeof(filelist), "%s/filelist", tmpdir); - if ((out = fopen(filelist, "w")) == NULL) + if ((out = fopen(filelist, "w")) == NULL) { + free(buf); return -4; + } while (getline(&buf, &buflen, fp) != -1) { contents_entry *e; @@ -280,41 +314,38 @@ qpkg_make(depend_atom *atom) printf(" %s-%s %s/%s: ", GREEN, NORM, atom->CATEGORY, atom_to_pvr(atom)); fflush(stdout); - snprintf(tbz2, sizeof(tbz2), "%s/bin.tar.bz2", tmpdir); + snprintf(tbz2, sizeof(tbz2), "%s/bin.tbz2", tmpdir); if (snprintf(buf, buflen, "tar jcf '%s' --files-from='%s' " - "--no-recursion >/dev/null 2>&1", tbz2, filelist) > (int)buflen) - return 2; - if ((fp = popen(buf, "r")) == NULL) + "--no-recursion >/dev/null 2>&1", tbz2, filelist) > (int)buflen || + (fp = popen(buf, "r")) == NULL) + { + free(buf); return 2; + } pclose(fp); - snprintf(xpak, sizeof(xpak), "%s/inf.xpak", tmpdir); snprintf(buf, buflen, "%s/%s/%s", portvdb, atom->CATEGORY, atom_to_pvr(atom)); xpak_argv[0] = buf; xpak_argv[1] = NULL; - xpak_create(AT_FDCWD, xpak, 1, xpak_argv); - - snprintf(buf, buflen, "%s/binpkg.tbz2", tmpdir); - tbz2_compose(AT_FDCWD, tbz2, xpak, buf); + xpak_create(AT_FDCWD, tbz2, 1, xpak_argv, 1, verbose); unlink(filelist); - unlink(xpak); - unlink(tbz2); - snprintf(tbz2, sizeof(tbz2), "%s/%s.tbz2", - qpkg_get_bindir(), atom_to_pvr(atom)); - if (rename(buf, tbz2)) { - warnp("could not move '%s' to '%s'", buf, tbz2); + snprintf(buf, buflen, "%s/%s.tbz2", qpkg_get_bindir(), atom_to_pvr(atom)); + if (rename(tbz2, buf)) { + warnp("could not move '%s' to '%s'", tbz2, buf); + free(buf); return 1; } rmdir(tmpdir); - stat(tbz2, &st); + stat(buf, &st); printf("%s%s%s kB\n", RED, make_human_readable_str(st.st_size, 1, KILOBYTE), NORM); + free(buf); return 0; } @@ -425,8 +456,12 @@ retry_mkdir: for (i = optind; i < argc; ++i) { if (!argv[i]) continue; - if (!strcmp(argv[i], atom->PN) || !strcmp(argv[i], atom->P) || !strcmp(argv[i], buf) || !strcmp(argv[i], "world")) - if (!qpkg_make(atom)) ++pkgs_made; + if (!strcmp(argv[i], atom->PN) || + !strcmp(argv[i], atom->P) || + !strcmp(argv[i], buf) || + !strcmp(argv[i], "world")) + if (!qpkg_make(atom)) + ++pkgs_made; } atom_implode(atom); @@ -437,13 +472,10 @@ retry_mkdir: s = (argc - optind) - pkgs_made; if (s && !pretend) - printf(" %s*%s %i package%s could not be matched :/\n", RED, NORM, (int)s, (s > 1 ? "s" : "")); + printf(" %s*%s %i package%s could not be matched :/\n", + RED, NORM, (int)s, (s > 1 ? "s" : "")); if (pkgs_made) qprintf(" %s*%s Packages can be found in %s\n", GREEN, NORM, bindir); return (pkgs_made ? EXIT_SUCCESS : EXIT_FAILURE); } - -#else -DEFINE_APPLET_STUB(qpkg) -#endif @@ -1,5 +1,5 @@ /* - * Copyright 2005-2018 Gentoo Authors + * Copyright 2005-2019 Gentoo Authors * Distributed under the terms of the GNU General Public License v2 * * Copyright 2005-2010 Ned Ludd - <solar@gentoo.org> @@ -7,7 +7,22 @@ * Copyright 2018- Fabian Groffen - <grobian@gentoo.org */ -#ifdef APPLET_qsearch +#include "main.h" +#include "applets.h" + +#include <stdio.h> +#include <string.h> +#include <xalloc.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +#include "atom.h" +#include "basename.h" +#include "cache.h" +#include "rmspace.h" +#include "xarray.h" +#include "xregex.h" #define QSEARCH_FLAGS "acesSNH" COMMON_FLAGS static struct option const qsearch_long_opts[] = { @@ -36,21 +51,32 @@ static const char * const qsearch_opts_help[] = { /* Search an ebuild's details via the metadata cache. */ static void -qsearch_ebuild_metadata(_q_unused_ int overlay_fd, const char *ebuild, const char *search_me, char *last, - bool search_desc, bool search_all, _q_unused_ bool search_name, bool show_name_only, bool show_homepage) +qsearch_ebuild_metadata( + int overlay_fd, + const char *ebuild, + const char *search_me, + char *last, + bool search_desc, + bool search_all, + bool search_name, + bool show_name_only, + bool show_homepage) { - portage_cache *pcache = cache_read_file(ebuild); + (void)overlay_fd; + (void)search_name; + + portage_cache *pcache = cache_read_file(portcachedir_type, ebuild); if (pcache == NULL) { - if (!reinitialize) - warnf("(cache update pending) %s", ebuild); - reinitialize = 1; + warnf("missing cache, please (re)generate"); return; } if (strcmp(pcache->atom->PN, last) != 0) { strncpy(last, pcache->atom->PN, LAST_BUF_SIZE); - if (search_all || rematch(search_me, (search_desc ? pcache->DESCRIPTION : ebuild), REG_EXTENDED | REG_ICASE) == 0) + if (search_all || rematch(search_me, + (search_desc ? pcache->DESCRIPTION : ebuild), + REG_EXTENDED | REG_ICASE) == 0) printf("%s%s/%s%s%s%s%s\n", BOLD, pcache->atom->CATEGORY, BLUE, pcache->atom->PN, NORM, (show_name_only ? "" : " "), @@ -62,22 +88,37 @@ qsearch_ebuild_metadata(_q_unused_ int overlay_fd, const char *ebuild, const cha /* Search an ebuild's details via the ebuild cache. */ static void -qsearch_ebuild_ebuild(int overlay_fd, const char *ebuild, const char *search_me, char *last, - _q_unused_ bool search_desc, bool search_all, bool search_name, bool show_name_only, _q_unused_ bool show_homepage) +qsearch_ebuild_ebuild( + int overlay_fd, + const char *ebuild, + const char *search_me, + char *last, + bool search_desc, + bool search_all, + bool search_name, + bool show_name_only, + bool show_homepage) { const char * const search_vars[] = { "DESCRIPTION=", "HOMEPAGE=" }; const char *search_var = search_vars[show_homepage ? 1 : 0]; size_t search_len = strlen(search_var); char *p, *q, *str; - + char *buf = NULL; + int linelen; + size_t buflen; + bool show_it = false; FILE *ebuildfp; + int fd; + str = xstrdup(ebuild); p = dirname(str); + (void)search_desc; + (void)show_homepage; + if (strcmp(p, last) == 0) goto no_cache_ebuild_match; - bool show_it = false; strncpy(last, p, LAST_BUF_SIZE); if (search_name) { if (rematch(search_me, basename(last), REG_EXTENDED | REG_ICASE) != 0) { @@ -88,7 +129,7 @@ qsearch_ebuild_ebuild(int overlay_fd, const char *ebuild, const char *search_me, } } - int fd = openat(overlay_fd, ebuild, O_RDONLY|O_CLOEXEC); + fd = openat(overlay_fd, ebuild, O_RDONLY|O_CLOEXEC); if (fd != -1) { ebuildfp = fdopen(fd, "r"); if (ebuildfp == NULL) { @@ -96,15 +137,10 @@ qsearch_ebuild_ebuild(int overlay_fd, const char *ebuild, const char *search_me, goto no_cache_ebuild_match; } } else { - if (!reinitialize) - warnfp("(cache update pending) %s", ebuild); - reinitialize = 1; + warnf("missing cache, please (re)generate"); goto no_cache_ebuild_match; } - char *buf = NULL; - int linelen; - size_t buflen; while ((linelen = getline(&buf, &buflen, ebuildfp)) >= 0) { if ((size_t)linelen <= search_len) continue; @@ -115,7 +151,8 @@ qsearch_ebuild_ebuild(int overlay_fd, const char *ebuild, const char *search_me, if (strlen(buf) <= search_len) break; q = buf + search_len + 1; - if (!search_all && !search_name && rematch(search_me, q, REG_EXTENDED | REG_ICASE) != 0) + if (!search_all && !search_name && + rematch(search_me, q, REG_EXTENDED | REG_ICASE) != 0) break; show_it = true; break; @@ -216,7 +253,3 @@ int qsearch_main(int argc, char **argv) return ret; } - -#else -DEFINE_APPLET_STUB(qsearch) -#endif @@ -1,12 +1,14 @@ /* - * Copyright 2005-2018 Gentoo Foundation + * Copyright 2005-2019 Gentoo Foundation * Distributed under the terms of the GNU General Public License v2 * * Copyright 2005-2010 Ned Ludd - <solar@gentoo.org> * Copyright 2005-2014 Mike Frysinger - <vapier@gentoo.org> + * Copyright 2018- Fabian Groffen - <grobian@gentoo.org> */ -#ifdef APPLET_qsize +#include "main.h" +#include "applets.h" /* Solaris */ #if defined(__sun) && defined(__SVR4) @@ -41,6 +43,18 @@ # define S_BLKSIZE 512 #endif +#include <stdio.h> +#include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> + +#include "atom.h" +#include "contents.h" +#include "human_readable.h" +#include "vdb.h" +#include "xarray.h" +#include "xregex.h" + #define QSIZE_FLAGS "fsSmkbi:" COMMON_FLAGS static struct option const qsize_long_opts[] = { {"filesystem", no_argument, NULL, 'f'}, @@ -136,8 +150,10 @@ qsize_cb(q_vdb_pkg_ctx *pkg_ctx, void *priv) if (e->type == CONTENTS_OBJ || e->type == CONTENTS_SYM) { struct stat st; ++num_files; - if (!fstatat(pkg_ctx->cat_ctx->ctx->portroot_fd, e->name + 1, &st, AT_SYMLINK_NOFOLLOW)) - num_bytes += (state->fs_size ? st.st_blocks * S_BLKSIZE : st.st_size); + if (!fstatat(pkg_ctx->cat_ctx->ctx->portroot_fd, + e->name + 1, &st, AT_SYMLINK_NOFOLLOW)) + num_bytes += + state->fs_size ? st.st_blocks * S_BLKSIZE : st.st_size; } else ++num_nonfiles; } @@ -235,7 +251,3 @@ int qsize_main(int argc, char **argv) return ret; } - -#else -DEFINE_APPLET_STUB(qsize) -#endif @@ -1,12 +1,25 @@ /* - * Copyright 2005-2018 Gentoo Foundation + * Copyright 2005-2019 Gentoo Foundation * Distributed under the terms of the GNU General Public License v2 * * Copyright 2005-2010 Ned Ludd - <solar@gentoo.org> * Copyright 2005-2014 Mike Frysinger - <vapier@gentoo.org> */ -#ifdef APPLET_qtbz2 +#include "main.h" +#include "applets.h" + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <string.h> +#include <unistd.h> +#include <stdio.h> + +#include "basename.h" +#include "copy_file.h" +#include "human_readable.h" +#include "safe_io.h" /* # The format for a tbz2/xpak: @@ -49,40 +62,6 @@ static const char * const qtbz2_opts_help[] = { static char tbz2_stdout = 0; -static unsigned char * -tbz2_encode_int(int enc) -{ - static unsigned char ret[4]; - ret[0] = (enc & 0xff000000) >> 24; - ret[1] = (enc & 0x00ff0000) >> 16; - ret[2] = (enc & 0x0000ff00) >> 8; - ret[3] = (enc & 0x000000ff); - return ret; -} -static int -tbz2_decode_int(unsigned char *buf) -{ - int ret; - ret = 0; - ret += (buf[0] << 24); - ret += (buf[1] << 16); - ret += (buf[2] << 8); - ret += (buf[3]); - return ret; -} - -static void -_tbz2_copy_file(FILE *src, FILE *dst) -{ - int count = 1; - unsigned char buffer[BUFSIZE*32]; - while (count) { - count = fread(buffer, 1, sizeof(buffer), src); - if (!count) return; - fwrite(buffer, 1, count, dst); - } -} - static int tbz2_compose(int dir_fd, const char *tarbz2, const char *xpak, const char *tbz2) { @@ -136,14 +115,15 @@ tbz2_compose(int dir_fd, const char *tarbz2, const char *xpak, const char *tbz2) } /* save [tarball] */ - _tbz2_copy_file(in_tarbz2, out); + copy_file(in_tarbz2, out); fclose(in_tarbz2); /* save [xpak] */ - _tbz2_copy_file(in_xpak, out); + copy_file(in_xpak, out); fclose(in_xpak); /* save tbz2 tail: OOOOSTOP */ - fwrite(tbz2_encode_int(st.st_size), 1, 4, out); + WRITE_BE_INT32(buf, st.st_size); + fwrite(buf, 1, 4, out); fwrite(TBZ2_END_MSG, 1, TBZ2_END_MSG_LEN, out); fclose(out); @@ -202,7 +182,8 @@ tbz2_decompose(int dir_fd, const char *tbz2, const char *tarbz2, const char *xpa goto close_in_and_ret; if (verbose) - printf("input tbz2: %s (%s)\n", tbz2, make_human_readable_str(st.st_size, 1, 0)); + printf("input tbz2: %s (%s)\n", tbz2, + make_human_readable_str(st.st_size, 1, 0)); /* verify the tail signature */ if (fseek(in, -TBZ2_END_LEN, SEEK_END) != 0) @@ -215,7 +196,7 @@ tbz2_decompose(int dir_fd, const char *tbz2, const char *tarbz2, const char *xpa } /* calculate xpak's size */ - xpak_size = tbz2_decode_int(tbz2_tail); + xpak_size = READ_BE_INT32(tbz2_tail); /* calculate tarbz2's size */ tarbz2_size = st.st_size - xpak_size - TBZ2_END_LEN; @@ -223,11 +204,13 @@ tbz2_decompose(int dir_fd, const char *tbz2, const char *tarbz2, const char *xpa rewind(in); /* dump the tar.bz2 */ if (verbose) - printf("output tar.bz2: %s (%s)\n", tarbz2, make_human_readable_str(tarbz2_size, 1, 0)); + printf("output tar.bz2: %s (%s)\n", tarbz2, + make_human_readable_str(tarbz2_size, 1, 0)); _tbz2_write_file(in, dir_fd, tarbz2, tarbz2_size); /* dump the xpak */ if (verbose) - printf("output xpak: %s (%s)\n", xpak, make_human_readable_str(xpak_size, 1, 0)); + printf("output xpak: %s (%s)\n", xpak, + make_human_readable_str(xpak_size, 1, 0)); _tbz2_write_file(in, dir_fd, xpak, xpak_size); ret = 0; @@ -266,9 +249,12 @@ int qtbz2_main(int argc, char **argv) } if (optind == argc) { switch (action) { - case TBZ2_ACT_JOIN: err("Join usage: <input tar.bz2> <input xpak> [<output tbz2>]"); - case TBZ2_ACT_SPLIT: err("Split usage: <input tbz2> [<output tar.bz2> <output xpak>]"); - default: qtbz2_usage(EXIT_FAILURE); + case TBZ2_ACT_JOIN: + err("Join usage: <input tar.bz2> <input xpak> [<output tbz2>]"); + case TBZ2_ACT_SPLIT: + err("Split usage: <input tbz2> [<output tar.bz2> <output xpak>]"); + default: + qtbz2_usage(EXIT_FAILURE); } } @@ -281,8 +267,8 @@ int qtbz2_main(int argc, char **argv) else if (strstr(argv[optind], ".tbz2") != NULL) action = TBZ2_ACT_SPLIT; else - err("%s: need to use -j or -s, or file must end in .tar.bz2 or .tbz2 to autodetect", - argv[optind]); + err("%s: need to use -j or -s, or file must end " + "in .tar.bz2 or .tbz2 to autodetect", argv[optind]); } /* tbz2tool join .tar.bz2 .xpak .tbz2 */ @@ -357,8 +343,7 @@ int qtbz2_main(int argc, char **argv) } /* We have to cleanup all resources as we're used indirectly - * (e.g. via qmerge). - */ + * (e.g. via qmerge). */ free(heap_tbz2); free(heap_xpak); free(heap_tarbz2); @@ -367,7 +352,3 @@ int qtbz2_main(int argc, char **argv) return EXIT_SUCCESS; } - -#else -DEFINE_APPLET_STUB(qtbz2) -#endif @@ -7,10 +7,13 @@ * Copyright 2017-2018 Sam Besselink */ -#ifdef APPLET_qtegrity +#include "main.h" +#include "applets.h" +#include <string.h> #include <sys/types.h> #include <signal.h> +#include <fcntl.h> #define QTEGRITY_FLAGS "a:is" COMMON_FLAGS static struct option const qtegrity_long_opts[] = { @@ -56,6 +59,9 @@ struct qtegrity_opt_state { static void external_check_sha(char * ret_digest, char * filepath, char * algo) { size_t size_digest = 1; + char cmd[11]; + int pipefd[2]; + pid_t pid; if (strcmp(algo, "sha256") == 0) { size_digest = 64; @@ -67,12 +73,8 @@ static void external_check_sha(char * ret_digest, char * filepath, char * algo) return; } - char cmd[11]; snprintf(cmd, 10, "%ssum", algo); - int pipefd[2]; - pid_t pid; - if (pipe(pipefd) == -1) { perror("Couldn't create pipe to shasum\n"); exit(1); @@ -504,7 +506,3 @@ int qtegrity_main(int argc, char **argv) return EXIT_SUCCESS; } - -#else -DEFINE_APPLET_STUB(qtegrity) -#endif @@ -7,7 +7,22 @@ * Copyright 2018- Fabian Groffen - <grobian@gentoo.org> */ -#ifdef APPLET_quse +#include "main.h" +#include "applets.h" + +#include <stdio.h> +#include <string.h> +#include <xalloc.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <dirent.h> +#include <assert.h> + +#include "cache.h" +#include "rmspace.h" +#include "xarray.h" +#include "xregex.h" /* quse -CKe -- '-*' {'~',-,}{alpha,amd64,hppa,ia64,ppc,ppc64,sparc,x86} @@ -88,7 +103,11 @@ quse_describe_flag(const char *overlay, unsigned int ind, unsigned int argc, cha char *buf, *p; unsigned int i, f; size_t s; - const char * const search_files[] = { "use.desc", "use.local.desc", "arch.list", }; + const char * const search_files[] = { + "use.desc", + "use.local.desc", + "arch.list" + }; FILE *fp[NUM_SEARCH_FILES]; int dfd, fd; DIR *d; @@ -218,7 +237,8 @@ quse_describe_flag(const char *overlay, unsigned int ind, unsigned int argc, cha for (i = ind; i < argc; i++) if (!strcmp(argv[i], buf)) - printf(" %s%s%s:%s%s%s: %s\n", BOLD, de->d_name, NORM, BLUE, argv[i], NORM, p); + printf(" %s%s%s:%s%s%s: %s\n", + BOLD, de->d_name, NORM, BLUE, argv[i], NORM, p); } fclose(fp[0]); } @@ -243,7 +263,12 @@ int quse_main(int argc, char **argv) char *ebuild; const char *search_var = NULL; - const char *search_vars[] = { "IUSE=", "KEYWORDS=", "LICENSE=", search_var }; + const char *search_vars[] = { + "IUSE=", + "KEYWORDS=", + "LICENSE=", + search_var + }; short quse_all = 0; int regexp_matching = 1, i, idx = 0; size_t search_len; @@ -277,6 +302,8 @@ int quse_main(int argc, char **argv) assert(search_len < sizeof(buf0)); array_for_each(overlays, n, overlay) { + int overlay_fd; + cache_file = initialize_flat(overlay, CACHE_EBUILD, false); if ((fp = fopen(cache_file, "re")) == NULL) { @@ -284,7 +311,7 @@ int quse_main(int argc, char **argv) continue; } - int overlay_fd = open(overlay, O_RDONLY|O_CLOEXEC|O_PATH); + overlay_fd = open(overlay, O_RDONLY|O_CLOEXEC|O_PATH); ebuild = NULL; while ((linelen = getline(&ebuild, &ebuildlen, fp)) >= 0) { @@ -299,24 +326,12 @@ int quse_main(int argc, char **argv) newfp = fdopen(fd, "r"); if (newfp != NULL) { unsigned int lineno = 0; - char revision[sizeof(buf0)]; - char date[sizeof(buf0)]; - char user[sizeof(buf0)]; - revision[0] = 0; - user[0] = 0; - date[0] = 0; while (fgets(buf0, sizeof(buf0), newfp) != NULL) { int ok = 0; char warned = 0; lineno++; - if (*buf0 == '#') { - if (strncmp(buf0, "# $Header: /", 12) == 0) - sscanf(buf0, "%*s %*s %*s %s %s %*s %s %*s %*s", - revision, date, user); - continue; - } if (strncmp(buf0, search_vars[idx], search_len) != 0) continue; @@ -417,14 +432,9 @@ int quse_main(int argc, char **argv) } } if (ok) { - if (verbose > 3) - printf("%s %s %s ", - *user ? user : "MISSING", - *revision ? revision : "MISSING", - *date ? date : "MISSING"); - printf("%s%s%s ", CYAN, ebuild, NORM); - print_highlighted_use_flags(&buf0[search_len + 1], optind, argc, argv); + print_highlighted_use_flags(&buf0[search_len + 1], + optind, argc, argv); puts(NORM); if (verbose > 1) { char **ARGV; @@ -438,9 +448,7 @@ int quse_main(int argc, char **argv) } fclose(newfp); } else { - if (!reinitialize) - warnfp("(cache update pending) %s", ebuild); - reinitialize = 1; + warnf("missing cache, please (re)generate"); } } fclose(fp); @@ -449,7 +457,3 @@ int quse_main(int argc, char **argv) return EXIT_SUCCESS; } - -#else -DEFINE_APPLET_STUB(quse) -#endif @@ -1,32 +1,25 @@ /* - * Copyright 2005-2018 Gentoo Foundation + * Copyright 2005-2019 Gentoo Foundation * Distributed under the terms of the GNU General Public License v2 * * Copyright 2005-2010 Ned Ludd - <solar@gentoo.org> * Copyright 2005-2014 Mike Frysinger - <vapier@gentoo.org> */ -#ifdef APPLET_qxpak +#include "main.h" +#include "applets.h" -/* -# The format for a tbz2/xpak: -# -# tbz2: tar.bz2 + xpak + (xpak_offset) + "STOP" -# xpak: "XPAKPACK" + (index_len) + (data_len) + index + data + "XPAKSTOP" -# index: (pathname_len) + pathname + (data_offset) + (data_len) -# index entries are concatenated end-to-end. -# data: concatenated data chunks, end-to-end. -# -# [tarball]XPAKPACKIIIIDDDD[index][data]XPAKSTOPOOOOSTOP -# -# (integer) == encodeint(integer) ===> 4 characters (big-endian copy) -# '+' means concatenate the fields ===> All chunks are strings -*/ -#define XPAK_START_MSG "XPAKPACK" -#define XPAK_START_MSG_LEN 8 -#define XPAK_START_LEN (8 + 4 + 4) -#define XPAK_END_MSG "XPAKSTOP" -#define XPAK_END_MSG_LEN 8 +#include <string.h> +#include <assert.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +#include "basename.h" +#include "copy_file.h" +#include "safe_io.h" +#include "scandirat.h" +#include "xpak.h" #define QXPAK_FLAGS "lxcd:O" COMMON_FLAGS static struct option const qxpak_long_opts[] = { @@ -47,100 +40,21 @@ static const char * const qxpak_opts_help[] = { }; #define qxpak_usage(ret) usage(ret, QXPAK_FLAGS, qxpak_long_opts, qxpak_opts_help, NULL, lookup_applet_idx("qxpak")) -typedef struct { - int dir_fd; - FILE *fp; - int index_len; - int data_len; - char *index, *data; -} _xpak_archive; - static char xpak_stdout; -typedef void (*xpak_callback_t)(int,char*,int,int,int,char*); - -static void _xpak_walk_index(_xpak_archive *x, int argc, char **argv, xpak_callback_t func) -{ - int i, pathname_len, data_offset, data_len; - char *p, pathname[100]; - - p = x->index; - while ((p - x->index) < x->index_len) { - pathname_len = tbz2_decode_int((unsigned char*)p); - assert((size_t)pathname_len < sizeof(pathname)); - p += 4; - memcpy(pathname, p, pathname_len); - pathname[pathname_len] = '\0'; - if (strchr(pathname, '/') != NULL || strchr(pathname, '\\') != NULL) - err("Index contains a file with a path: '%s'", pathname); - p += pathname_len; - data_offset = tbz2_decode_int((unsigned char*)p); - p += 4; - data_len = tbz2_decode_int((unsigned char*)p); - p += 4; - if (argc) { - for (i = 0; i < argc; ++i) - if (argv[i] && !strcmp(pathname, argv[i])) { - argv[i] = NULL; - break; - } - if (i == argc) - continue; - } - (*func)(x->dir_fd, pathname, pathname_len, data_offset, data_len, x->data); - } - - if (argc) - for (i = 0; i < argc; ++i) - if (argv[i]) - warn("Could not locate '%s' in archive", argv[i]); -} - -static _xpak_archive *_xpak_open(const char *file) -{ - static _xpak_archive ret; - char buf[XPAK_START_LEN]; - - /* init the file */ - memset(&ret, 0x00, sizeof(ret)); - if (file[0] == '-' && file[1] == '\0') - ret.fp = stdin; - else if ((ret.fp = fopen(file, "r")) == NULL) - return NULL; - - /* verify this xpak doesnt suck */ - if (fread(buf, 1, XPAK_START_LEN, ret.fp) != XPAK_START_LEN) - goto close_and_ret; - if (memcmp(buf, XPAK_START_MSG, XPAK_START_MSG_LEN)) { - warn("%s: Invalid xpak", file); - goto close_and_ret; - } - - /* calc index and data sizes */ - ret.index_len = tbz2_decode_int((unsigned char*)buf+XPAK_START_MSG_LEN); - ret.data_len = tbz2_decode_int((unsigned char*)buf+XPAK_START_MSG_LEN+4); - if (!ret.index_len || !ret.data_len) { - warn("Skipping empty archive '%s'", file); - goto close_and_ret; - } - - return &ret; - -close_and_ret: - if (ret.fp != stdin) - fclose(ret.fp); - return NULL; -} - -static void _xpak_close(_xpak_archive *x) -{ - fclose(x->fp); -} - static void -_xpak_list_callback(_q_unused_ int dir_fd, char *pathname, _q_unused_ int pathname_len, - int data_offset, int data_len, _q_unused_ char *data) +_xpak_list_callback( + int dir_fd, + char *pathname, + int pathname_len, + int data_offset, + int data_len, + char *data) { + (void)dir_fd; + (void)pathname_len; + (void)data; + if (!verbose) puts(pathname); else if (verbose == 1) @@ -149,34 +63,18 @@ _xpak_list_callback(_q_unused_ int dir_fd, char *pathname, _q_unused_ int pathna printf("%s: %i byte%c @ offset byte %i\n", pathname, data_len, (data_len>1?'s':' '), data_offset); } -static int -xpak_list(int dir_fd, const char *file, int argc, char **argv) -{ - _xpak_archive *x; - char buf[BUFSIZE]; - size_t ret; - - x = _xpak_open(file); - if (!x) - return 1; - - x->dir_fd = dir_fd; - x->index = buf; - assert((size_t)x->index_len < sizeof(buf)); - ret = fread(x->index, 1, x->index_len, x->fp); - assert(ret == (size_t)x->index_len); - _xpak_walk_index(x, argc, argv, &_xpak_list_callback); - - _xpak_close(x); - - return 0; -} static void -_xpak_extract_callback(int dir_fd, char *pathname, _q_unused_ int pathname_len, - int data_offset, int data_len, char *data) +_xpak_extract_callback( + int dir_fd, + char *pathname, + int pathname_len, + int data_offset, + int data_len, + char *data) { FILE *out; + (void)pathname_len; if (verbose == 1) puts(pathname); @@ -184,7 +82,8 @@ _xpak_extract_callback(int dir_fd, char *pathname, _q_unused_ int pathname_len, printf("%s: %i byte%c\n", pathname, data_len, (data_len>1?'s':' ')); if (!xpak_stdout) { - int fd = openat(dir_fd, pathname, O_WRONLY|O_CLOEXEC|O_CREAT|O_TRUNC, 0644); + int fd = openat(dir_fd, pathname, + O_WRONLY|O_CLOEXEC|O_CREAT|O_TRUNC, 0644); if (fd < 0) return; out = fdopen(fd, "w"); @@ -198,190 +97,6 @@ _xpak_extract_callback(int dir_fd, char *pathname, _q_unused_ int pathname_len, if (!xpak_stdout) fclose(out); } -static int -xpak_extract(int dir_fd, const char *file, int argc, char **argv) -{ - _xpak_archive *x; - char buf[BUFSIZE], ext[BUFSIZE*32]; - size_t in; - - x = _xpak_open(file); - if (!x) - return 1; - - x->dir_fd = dir_fd; - x->index = buf; - - assert((size_t)x->index_len < sizeof(buf)); - in = fread(x->index, 1, x->index_len, x->fp); - if ((int)in != x->index_len) - err("index chunk: read %i bytes, wanted %i bytes", (int)in, x->index_len); - - /* the xpak may be large (like when it has CONTENTS) #300744 */ - x->data = (size_t)x->data_len < sizeof(ext) ? ext : xmalloc(x->data_len); - in = fread(x->data, 1, x->data_len, x->fp); - if ((int)in != x->data_len) - err("data chunk: read %i bytes, wanted %i bytes", (int)in, x->data_len); - - _xpak_walk_index(x, argc, argv, &_xpak_extract_callback); - - _xpak_close(x); - - if (x->data != ext) - free(x->data); - - return 0; -} - -static void -_xpak_add_file(int dir_fd, const char *filename, struct stat *st, FILE *findex, - int *index_len, FILE *fdata, int *data_len) -{ - FILE *fin; - unsigned char *p; - const char *basefile; - int fd, in_len; - - if ((basefile = strrchr(filename, '/')) == NULL) { - basefile = filename; - } else { - ++basefile; - assert(*basefile); - } - - if (verbose == 1) - printf("%s\n", basefile); - else if (verbose) - printf("%s @ offset byte %i\n", basefile, *data_len); - - /* write out the (pathname_len) */ - in_len = strlen(basefile); - p = tbz2_encode_int(in_len); - fwrite(p, 1, 4, findex); - /* write out the pathname */ - fwrite(basefile, 1, in_len, findex); - /* write out the (data_offset) */ - p = tbz2_encode_int(*data_len); - fwrite(p, 1, 4, findex); - - *index_len += 4 + in_len + 4 + 4; - - /* now open the file, get (data_len), and append the file to the data file */ - fd = openat(dir_fd, filename, O_RDONLY|O_CLOEXEC); - if (fd < 0) { - open_fail: - warnp("could not open for reading: %s", filename); - fake_data_len: - p = tbz2_encode_int(0); - fwrite(p, 1, 4, findex); - return; - } - fin = fdopen(fd, "r"); - if (!fin) { - close(fd); - goto open_fail; - } - in_len = st->st_size; - /* the xpak format can only store files whose size is a 32bit int - * so we have to make sure we don't store a big file */ - if (in_len != st->st_size) { - warnf("File is too big: %"PRIu64, (uint64_t)st->st_size); - fclose(fin); - goto fake_data_len; - } - p = tbz2_encode_int(in_len); - fwrite(p, 1, 4, findex); - _tbz2_copy_file(fin, fdata); - fclose(fin); - - *data_len += in_len; -} -static int -xpak_create(int dir_fd, const char *file, int argc, char **argv) -{ - FILE *findex, *fdata, *fout; - struct dirent **dir; - int i, fidx, numfiles; - struct stat st; - char path[_Q_PATH_MAX]; - unsigned char *p; - int index_len, data_len; - - if (argc == 0) - err("Create usage: <xpak output> <files/dirs to pack>"); - - if (strlen(file) >= sizeof(path)-6) - err("Pathname is too long: %s", file); - - if ((fout = fopen(file, "w")) == NULL) { - warnp("could not open output: %s", file); - return 1; - } - strcpy(path, file); strcat(path, ".index"); - if ((findex = fopen(path, "w+")) == NULL) { - warnp("could not open output: %s", path); - fclose(fout); - return 1; - } - strcpy(path, file); strcat(path, ".dat"); - if ((fdata = fopen(path, "w+")) == NULL) { - warnp("could not open output: %s", path); - fclose(fout); - fclose(findex); - return 1; - } - - index_len = data_len = 0; - for (i = 0; i < argc; ++i) { - if (fstatat(dir_fd, argv[i], &st, 0)) { - warnp("fstatat(%s) failed", argv[i]); - continue; - } - if (S_ISDIR(st.st_mode)) { - if ((numfiles = scandir(argv[i], &dir, filter_hidden, alphasort)) < 0) - warn("Directory '%s' is empty; skipping", argv[i]); - for (fidx = 0; fidx < numfiles; ++fidx) { - int ret = snprintf(path, sizeof(path), "%s/%s", - argv[i], dir[fidx]->d_name); - if (ret < 0 || (size_t)ret >= sizeof(path)) { - warn("skipping path too long: %s/%s", - argv[i], dir[fidx]->d_name); - continue; - } - if (stat(path, &st) < 0) { - warnp("could not read %s", path); - continue; - } - _xpak_add_file(dir_fd, path, &st, findex, &index_len, fdata, &data_len); - } - scandir_free(dir, numfiles); - } else if (S_ISREG(st.st_mode)) { - _xpak_add_file(dir_fd, argv[i], &st, findex, &index_len, fdata, &data_len); - } else - warn("Skipping non file/directory '%s'", argv[i]); - } - - rewind(findex); - rewind(fdata); - - /* "XPAKPACK" + (index_len) + (data_len) + index + data + "XPAKSTOP" */ - fwrite(XPAK_START_MSG, 1, XPAK_START_MSG_LEN, fout); /* "XPAKPACK" */ - p = tbz2_encode_int(index_len); - fwrite(p, 1, 4, fout); /* (index_len) */ - p = tbz2_encode_int(data_len); - fwrite(p, 1, 4, fout); /* (data_len) */ - _tbz2_copy_file(findex, fout); /* index */ - _tbz2_copy_file(fdata, fout); /* data */ - fwrite(XPAK_END_MSG, 1, XPAK_END_MSG_LEN, fout); /* "XPAKSTOP" */ - - strcpy(path, file); strcat(path, ".index"); unlink(path); - strcpy(path, file); strcat(path, ".dat"); unlink(path); - fclose(findex); - fclose(fdata); - fclose(fout); - - return 0; -} int qxpak_main(int argc, char **argv) { @@ -417,10 +132,17 @@ int qxpak_main(int argc, char **argv) argv += optind; switch (action) { - case XPAK_ACT_LIST: ret = xpak_list(dir_fd, xpak, argc, argv); break; - case XPAK_ACT_EXTRACT: ret = xpak_extract(dir_fd, xpak, argc, argv); break; - case XPAK_ACT_CREATE: ret = xpak_create(dir_fd, xpak, argc, argv); break; - default: ret = EXIT_FAILURE; + case XPAK_ACT_LIST: + ret = xpak_list(dir_fd, xpak, argc, argv, &_xpak_list_callback); + break; + case XPAK_ACT_EXTRACT: + ret = xpak_extract(dir_fd, xpak, argc, argv, &_xpak_extract_callback); + break; + case XPAK_ACT_CREATE: + ret = xpak_create(dir_fd, xpak, argc, argv, 0, verbose); + break; + default: + ret = EXIT_FAILURE; } if (dir_fd != AT_FDCWD) @@ -428,7 +150,3 @@ int qxpak_main(int argc, char **argv) return ret; } - -#else -DEFINE_APPLET_STUB(qxpak) -#endif |