[packages/rpm-getdeps] - import lost package, rpm 4 does not support '--specsrpm' option
baggins
baggins at pld-linux.org
Sat Oct 24 14:46:57 CEST 2020
commit 5f9d987314ee3dbe22fe5c5f371498706b4718e9
Author: Jan Rękorajski <baggins at pld-linux.org>
Date: Sat Oct 24 14:46:15 2020 +0200
- import lost package, rpm 4 does not support '--specsrpm' option
getdeps.c | 295 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
rpm-getdeps.spec | 56 +++++++++++
2 files changed, 351 insertions(+)
---
diff --git a/rpm-getdeps.spec b/rpm-getdeps.spec
new file mode 100644
index 0000000..40aabf4
--- /dev/null
+++ b/rpm-getdeps.spec
@@ -0,0 +1,56 @@
+# $Revision: 1.4 $, $Date: 2005/09/12 16:46:06 $
+Summary: Get dependencies out of RPM spec file
+Summary(pl): Pobieranie zależności z pliku spec pakietu RPM
+Name: rpm-getdeps
+Version: 0.0.7
+Release: 2
+License: GPL
+Vendor: Joey Hess <joey at kitenet.net>
+Group: Applications/System
+Source0: http://www-user.tu-chemnitz.de/~ensc/getdeps.c
+# Source0-md5: c20a7f6a0ef86461514fbf55092ae434
+BuildRequires: rpm-devel
+BuildRoot: %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
+
+%description
+Get dependencies out of RPM spec file.
+
+%description -l pl
+Pobieranie zależności z pliku spec pakietu RPM.
+
+%prep
+%setup -q -c -T
+
+%build
+%{__cc} %{rpmcflags} %{rpmldflags} -I/usr/include/rpm -Wall -lrpm -lrpmbuild %{SOURCE0} -o %{name}
+
+%install
+rm -rf $RPM_BUILD_ROOT
+install -d $RPM_BUILD_ROOT%{_bindir}
+
+install %{name} $RPM_BUILD_ROOT%{_bindir}
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(644,root,root,755)
+%attr(755,root,root) %{_bindir}/*
+
+%define date %(echo `LC_ALL="C" date +"%a %b %d %Y"`)
+%changelog
+* %{date} PLD Team <feedback at pld-linux.org>
+All persons listed below can be reached at <cvs_login>@pld-linux.org
+
+$Log: rpm-getdeps.spec,v $
+Revision 1.4 2005/09/12 16:46:06 glen
+- integer release, 2, STBR
+
+Revision 1.3 2004/06/17 19:36:58 arekm
+- rebuild
+
+Revision 1.2 2004/06/06 15:33:58 qboosh
+- pl
+
+Revision 1.1 2004/06/06 09:56:47 arekm
+- initial pld release
diff --git a/getdeps.c b/getdeps.c
new file mode 100644
index 0000000..571df0f
--- /dev/null
+++ b/getdeps.c
@@ -0,0 +1,295 @@
+// $Id$ --*- c -*--
+
+// Copyright (C) 2003 Enrico Scholz <enrico.scholz at informatik.tu-chemnitz.de>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; version 2 of the License.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// version 0.0.7, 2003-11-21
+// * made it compilable with non-C99 compilers
+//
+// version 0.0.6, 2003-11-21
+// * added rpm-4.0.4 compatibility (define RPM404 macro)
+//
+// version 0.0.5, 2003-11-21
+// * added '--uid' and '--gid' options
+// * use macros for option-ids
+//
+// version 0.0.4, 2003-11-19
+// * set 'force' flag on parseSpec() to ignore missing sources & patches
+//
+// version 0.0.3, 2003-11-19
+// * fixed buffer-overflow in '--with[out]' statements
+//
+// version 0.0.2, 2003-11-19
+// * big rewrite; implemented nearly the full functionality
+//
+// version 0.0.1, 2003-11-19
+// * initial version
+
+
+#define _GNU_SOURCE
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <getopt.h>
+#include <stdbool.h>
+#include <string.h>
+#include <assert.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include <sys/types.h>
+
+#include <rpmbuild.h>
+#include <rpmlib.h>
+#include <header.h>
+
+#ifndef RPM404
+# include <rpmts.h>
+#endif
+
+#define ARG_WITH 1024
+#define ARG_WITHOUT 1025
+#define ARG_DEFINE 1026
+#define ARG_TARGET 1027
+#define ARG_RCFILE 1028
+#define ARG_CHROOT 1029
+#define ARG_UID 1030
+#define ARG_GID 1031
+
+static struct option const
+CMDLINE_OPTIONS[] = {
+ { "help", no_argument, 0, 'h' },
+ { "version", no_argument, 0, 'v' },
+ { "with", required_argument, 0, ARG_WITH },
+ { "without", required_argument, 0, ARG_WITHOUT },
+ { "define", required_argument, 0, ARG_DEFINE },
+ { "target", required_argument, 0, ARG_TARGET },
+ { "rcfile", required_argument, 0, ARG_RCFILE },
+ { "chroot", required_argument, 0, ARG_CHROOT },
+ { "uid", required_argument, 0, ARG_UID },
+ { "gid", required_argument, 0, ARG_GID },
+ { 0,0,0,0 }
+};
+
+struct Arguments
+{
+ char const * target;
+ char const * rcfile;
+ char const * chroot;
+ uid_t uid;
+ gid_t gid;
+
+ struct {
+ char const ** values;
+ size_t cnt;
+ size_t reserved;
+ } macros;
+
+ char const * specfile;
+};
+
+struct DepSet {
+ int32_t const * flags;
+ char const ** name;
+ char const ** version;
+ ssize_t cnt;
+};
+
+inline static void
+writeStr(int fd, char const *cmd)
+{
+ (void)write(fd, cmd, strlen(cmd));
+}
+
+#define WRITE_MSG(FD,X) (void)(write(FD,X,sizeof(X)-1))
+#define WRITE_STR(FD,X) writeStr(FD,X)
+
+static void
+showHelp(int fd, char const *cmd, int res)
+{
+ char tmp[strlen(cmd)+1];
+ strcpy(tmp, cmd);
+
+ WRITE_MSG(fd, "Usage: ");
+ WRITE_STR(fd, basename(tmp));
+ WRITE_MSG(fd,
+ " [--define '<macro> <value>']* [--with[out] <key>]* [--chroot <dir>]\n"
+ " [--target <target>] [--rcfile <rcfile>] [--] <specfile>\n");
+ exit(res);
+}
+
+static void
+addDefine(struct Arguments *args, char const *val)
+{
+ register size_t c = args->macros.cnt;
+ if (args->macros.reserved <= c) {
+ args->macros.reserved *= 2;
+ args->macros.reserved += 1;
+
+ args->macros.values = realloc(args->macros.values,
+ args->macros.reserved * sizeof(char const *));
+ if (args->macros.values==0) {
+ perror("realloc()");
+ exit(1);
+ }
+ }
+
+ args->macros.values[c] = strdup(val);
+ ++args->macros.cnt;
+}
+
+static void
+setWithMacro(struct Arguments *args,
+ char const *name, char const *prefix, size_t prefix_len)
+{
+ size_t len = strlen(name);
+ char tmp[2*len + 2*prefix_len + sizeof("__ ---")];
+ char * ptr = tmp;
+
+ // set '_<prefix>_<name>'
+ *ptr++ = '_';
+ memcpy(ptr, prefix, prefix_len); ptr += prefix_len;
+ *ptr++ = '_';
+ memcpy(ptr, name, len); ptr += len;
+ *ptr++ = ' ';
+
+ // append ' --<prefix>-<name>'
+ *ptr++ = '-';
+ *ptr++ = '-';
+ memcpy(ptr, prefix, prefix_len); ptr += prefix_len;
+ *ptr++ = '-';
+ memcpy(ptr, name, len); ptr += len;
+ *ptr = '\0';
+
+ addDefine(args, tmp);
+}
+
+
+static void
+parseArgs(struct Arguments *args, int argc, char *argv[])
+{
+ while (1) {
+ int c = getopt_long(argc, argv, "", CMDLINE_OPTIONS, 0);
+ if (c==-1) break;
+ switch (c) {
+ case 'h' : showHelp(1, argv[0], 0);
+ case ARG_TARGET : args->target = optarg; break;
+ case ARG_RCFILE : args->rcfile = optarg; break;
+ case ARG_CHROOT : args->chroot = optarg; break;
+ case ARG_UID : args->uid = atoi(optarg); break;
+ case ARG_GID : args->gid = atoi(optarg); break;
+ case ARG_DEFINE : addDefine(args, optarg); break;
+ case ARG_WITH : setWithMacro(args, optarg, "with", 4); break;
+ case ARG_WITHOUT : setWithMacro(args, optarg, "without", 7); break;
+ default:
+ WRITE_MSG(2, "Try '");
+ WRITE_STR(2, argv[0]);
+ WRITE_MSG(2, " --help\" for more information.\n");
+ exit(1);
+ }
+ }
+
+ if (optind+1!=argc) {
+ write(2, "No/too much specfile(s) given; aborting\n", 40);
+ exit(1);
+ }
+
+ if (args->gid==(gid_t)(-1))
+ args->gid = args->uid;
+
+ args->specfile = argv[optind];
+}
+
+static void
+setMacros(char const * const *macros, size_t cnt)
+{
+ size_t i;
+ for (i=0; i<cnt; ++i)
+ rpmDefineMacro(rpmGlobalMacroContext, macros[i], 0);
+}
+
+static void
+printDepSet(struct DepSet const *set, char const *prefix)
+{
+ ssize_t i;
+ for (i=0; i<set->cnt; ++i)
+ printf("%s%08x %s %s\n", prefix, set->flags[i], set->name[i], set->version[i]);
+}
+
+static void
+evaluateHeader(Header h)
+{
+ int32_t cnt[3];
+ struct DepSet buildreqs = { 0,0,0,0 };
+ struct DepSet conflicts = { 0,0,0,0 };
+
+ if (headerGetEntry(h, RPMTAG_REQUIREFLAGS, 0, (void**)&buildreqs.flags, cnt+0) &&
+ headerGetEntry(h, RPMTAG_REQUIRENAME, 0, (void**)&buildreqs.name, cnt+1) &&
+ headerGetEntry(h, RPMTAG_REQUIREVERSION, 0, (void**)&buildreqs.version, cnt+2)) {
+ assert(cnt[0]==cnt[1] && cnt[1]==cnt[2]);
+ buildreqs.cnt = cnt[0];
+ }
+
+ if (headerGetEntry(h, RPMTAG_CONFLICTFLAGS, 0, (void**)&conflicts.flags, cnt+0) &&
+ headerGetEntry(h, RPMTAG_CONFLICTNAME, 0, (void**)&conflicts.name, cnt+1) &&
+ headerGetEntry(h, RPMTAG_CONFLICTVERSION, 0, (void**)&conflicts.version, cnt+2)) {
+ assert(cnt[0]==cnt[1] && cnt[1]==cnt[2]);
+ conflicts.cnt = cnt[0];
+ }
+
+ printDepSet(&buildreqs, "+ ");
+ printDepSet(&conflicts, "- ");
+}
+
+int main(int argc, char *argv[])
+{
+ struct Arguments args = { 0,0,0,-1,-1, {0,0,0}, 0 };
+ Spec s;
+
+ parseArgs(&args, argc, argv);
+
+ if ((args.chroot && chroot(args.chroot)==-1) ||
+ (args.uid!=(uid_t)(-1) && (setgroups(0,0) ==-1 || getgroups(0,0)!=0)) ||
+ (args.gid!=(gid_t)(-1) && (setgid(args.gid)==-1 || getgid()!=args.gid)) ||
+ (args.uid!=(uid_t)(-1) && (setuid(args.uid)==-1 || getuid()!=args.uid))) {
+ perror("chroot/setuid/setgid()");
+ return EXIT_FAILURE;
+ }
+
+ rpmReadConfigFiles(args.rcfile, args.target);
+ setMacros(args.macros.values, args.macros.cnt);
+
+
+#ifndef RPM404
+ rpmts ts = rpmtsCreate();
+ if (parseSpec(ts, args.specfile, 0,0, 1, 0,0, 1,1)!=0) {
+ return EXIT_FAILURE;
+ }
+
+ s = rpmtsSpec(ts);
+#else
+ if (parseSpec(&s, args.specfile, 0,0, 1, 0,0, 1,1)!=0) {
+ return EXIT_FAILURE;
+ }
+#endif
+
+ evaluateHeader(s->buildRestrictions);
+}
+
+/// Local Variables:
+/// compile-command: "make getdeps LDFLAGS='-lrpm -lrpmbuild' CFLAGS='-I/usr/include/rpm -Wall -W -pedantic --std=c99 -g3 -O0'"
+/// compile-commandX: "make getdeps LDFLAGS='-lrpm-4.0.4 -lrpmbuild-4.0.4 -lrpmio-4.0.4 -lrpmdb-4.0.4 -lpopt' CFLAGS='-I/usr/include/rpm-4.0.4 -Wall -W -pedantic --std=c99 -g3 -O0 -DRPM404'"
+/// End:
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/rpm-getdeps.git/commitdiff/5f9d987314ee3dbe22fe5c5f371498706b4718e9
More information about the pld-cvs-commit
mailing list