summaryrefslogtreecommitdiffstats
path: root/lib/libpkg/pkgwrap.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libpkg/pkgwrap.c')
-rw-r--r--lib/libpkg/pkgwrap.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/lib/libpkg/pkgwrap.c b/lib/libpkg/pkgwrap.c
new file mode 100644
index 0000000..9c8c0c3
--- /dev/null
+++ b/lib/libpkg/pkgwrap.c
@@ -0,0 +1,90 @@
+/*
+ * FreeBSD install - a package for the installation and maintenance
+ * of non-core utilities.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Maxim Sobolev
+ * 8 September 2002
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "pkg.h"
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+extern char **environ;
+
+void
+pkg_wrap(long curver, char **argv)
+{
+ FILE* f;
+ char ver[9]; /* Format is: 'YYYYMMDD\0' */
+ char buffer[FILENAME_MAX+10]; /* Format is: 'YYYYMMDD <path>' */
+ char cmd[FILENAME_MAX+5]; /* Format is: '<path> -PPq' */
+ char *path, *cp;
+ long ptver, lpver;
+
+ if (getenv("PKG_NOWRAP") != NULL)
+ goto nowrap;
+
+ setenv("PKG_NOWRAP", "1", 1);
+
+ /* Get alternative location for package tools. */
+ if ((f = fopen(PKG_WRAPCONF_FNAME, "r")) == NULL) {
+ goto nowrap;
+ } else {
+ if (get_string(buffer, FILENAME_MAX+9, f) == NULL) {
+ goto nowrap;
+ } else {
+ if ((path = strrchr(buffer, ' ')) == NULL) {
+ goto nowrap;
+ } else {
+ *path++ = '\0';
+ }
+ }
+ }
+
+ if ((cp = strrchr(argv[0], '/')) == NULL) {
+ cp = argv[0];
+ } else {
+ cp++;
+ }
+
+ /* Get version of the other pkg_install and libpkg */
+ snprintf(cmd, FILENAME_MAX+10, "%s/%s -PPq", path, cp);
+ if ((f = popen(cmd, "r")) == NULL) {
+ perror("popen()");
+ goto nowrap;
+ } else {
+ if (get_string(ver, 9, f) == NULL)
+ goto nowrap;
+ else
+ ptver = strtol(ver, NULL, 10);
+ if (get_string(ver, 9, f) == NULL)
+ goto nowrap;
+ else
+ lpver = strtol(ver, NULL, 10);
+ pclose(f);
+ }
+
+ if ((lpver >= LIBPKG_VERSION) && (ptver > curver)) {
+ snprintf(cmd, FILENAME_MAX, "%s/%s", path, cp);
+ execve(cmd, argv, environ);
+ }
+
+nowrap:
+ unsetenv("PKG_NOWRAP");
+}
OpenPOWER on IntegriCloud