summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJudd Vinet <judd@archlinux.org>2004-08-23 08:52:47 +0200
committerJudd Vinet <judd@archlinux.org>2004-08-23 08:52:47 +0200
commitafc0d9a3c45b70edd948ce0be4a5e81d4da00c7e (patch)
treedef51fe618d783ce1f041d6928ac759f5c8a20cf
parentad87360a71927f2afb3f91f13005b3c477f82acf (diff)
downloadpacman-afc0d9a3c45b70edd948ce0be4a5e81d4da00c7e.tar.gz
pacman-afc0d9a3c45b70edd948ce0be4a5e81d4da00c7e.tar.xz
Imported from pacman-2.8.4.tar.gz
-rw-r--r--ChangeLog8
-rw-r--r--Makefile.in9
-rw-r--r--TODO8
-rw-r--r--etc/pacman.conf7
-rwxr-xr-xscripts/gensync8
-rwxr-xr-xscripts/makepkg4
-rwxr-xr-xscripts/makeworld2
-rwxr-xr-xscripts/updatesync221
-rw-r--r--src/db.c29
-rw-r--r--src/list.c33
-rw-r--r--src/list.h7
-rw-r--r--src/package.c6
-rw-r--r--src/pacman.c17
-rw-r--r--src/pacman.h2
-rw-r--r--src/util.c4
-rw-r--r--src/util.h2
16 files changed, 309 insertions, 58 deletions
diff --git a/ChangeLog b/ChangeLog
index 4118e4de..71d69b6b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
VERSION DESCRIPTION
-----------------------------------------------------------------------------
+2.8.4 - Added updatesync script from Jason Chu
+ - Changed the pacman binary to be dynamically linked
+ - Included a pacman.static binary as well
+ - Added fakeroot checks when seeing if we're root
+ - Fixed makepkg to use 'tail -n 1' instead of 'tail -1'
+ - Added patch from Kevin Piche:
+ - Cleanup db_loadpkgs(), add list_add_sorted()
+ - Fixed a memory leak in db_find_conflicts()
2.8.3 - Fixed a little makepkg bug with bash 3.0
- Fixed resolvedeps to always prefer literals over provisios
- Added --config option to specify an alternate config file
diff --git a/Makefile.in b/Makefile.in
index 5168268d..d187db42 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -34,7 +34,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
INSTALL_DATA = @INSTALL_DATA@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
-PACVER = 2.8.3
+PACVER = 2.8.4
TOPDIR = @srcdir@
SRCDIR = $(TOPDIR)/src/
@@ -45,7 +45,7 @@ SCRDIR = $(TOPDIR)/scripts/
CXX = @CC@
CXXFLAGS += @CFLAGS@ -g -Wall -pedantic -fno-exceptions \
-D_GNU_SOURCE -DPACVER=\"$(PACVER)\" -I. -Ilibftp
-LDFLAGS += @LDFLAGS@ -static -Llibftp -lftp -ltar -lz
+LDFLAGS += @LDFLAGS@ -Llibftp -lftp -ltar -lz
SRCS = $(SRCDIR)pacman.c \
$(SRCDIR)db.c \
@@ -72,6 +72,7 @@ all: libftp.a pacman vercmp convertdb man
pacman: $(OBJECTS) libftp.a
$(CXX) $(OBJECTS) -o $@ $(LDFLAGS)
+ $(CXX) $(OBJECTS) -o $@.static -static $(LDFLAGS)
vercmp: $(OBJDIR)vercmp.o $(OBJDIR)rpmvercmp.o
$(CXX) $(OBJDIR)vercmp.o $(OBJDIR)rpmvercmp.o $(CXXFLAGS) -o $@
@@ -96,11 +97,13 @@ libftp.a:
install: pacman vercmp convertdb man
$(INSTALL) -D -m0755 pacman $(DESTDIR)$(BINDIR)/pacman
+ $(INSTALL) -D -m0755 pacman.static $(DESTDIR)$(BINDIR)/pacman.static
$(INSTALL) -D -m0755 vercmp $(DESTDIR)$(BINDIR)/vercmp
$(INSTALL) -D -m0755 convertdb $(DESTDIR)$(BINDIR)/convertdb
$(INSTALL) -D -m0755 $(SCRDIR)makepkg $(DESTDIR)$(BINDIR)/makepkg
$(INSTALL) -D -m0755 $(SCRDIR)makeworld $(DESTDIR)$(BINDIR)/makeworld
$(INSTALL) -D -m0755 $(SCRDIR)gensync $(DESTDIR)$(BINDIR)/gensync
+ $(INSTALL) -D -m0755 $(SCRDIR)updatesync $(DESTDIR)$(BINDIR)/updatesync
$(INSTALL) -D -m0644 $(MANSRC)pacman.8 $(DESTDIR)$(MANDIR)/man8/pacman.8
$(INSTALL) -D -m0644 $(MANSRC)makepkg.8 $(DESTDIR)$(MANDIR)/man8/makepkg.8
$(INSTALL) -D -m0644 etc/pacman.conf $(DESTDIR)/etc/pacman.conf
@@ -115,7 +118,7 @@ clean:
(cd libftp; make clobber)
distclean: clean
- rm -f pacman convertdb vercmp
+ rm -f pacman pacman.static convertdb vercmp
rm -f Makefile
rm -f config.h config.status config.log
diff --git a/TODO b/TODO
deleted file mode 100644
index 8cec3c94..00000000
--- a/TODO
+++ /dev/null
@@ -1,8 +0,0 @@
-- think about consolidating the -A/-U/-S options into one smart
- install operation
-- replaces code doesn't run with -U or -A
-- when performing replaces, pacman should not remove old packages until
- the conflict checks are passed
-- handle version comparators in makepkg dep resolution (eg, glibc>=2.2.5)
-- check $PACCONF env var
-- add a --pretend option
diff --git a/etc/pacman.conf b/etc/pacman.conf
index ce10c3a9..21519138 100644
--- a/etc/pacman.conf
+++ b/etc/pacman.conf
@@ -30,12 +30,15 @@ HoldPkg = pacman glibc
# REPOSITORIES
# - can be defined here or included from another file
# - pacman will search repositories in the order defined here.
-# - local/custom mirrors can be added here, above the respective Include
-# for that repository
+# - local/custom mirrors can be added here or in separate files
#
+[current]
+# Add your preferred servers here, they will be used first
Include = /etc/pacman.d/current
+[extra]
+# Add your preferred servers here, they will be used first
Include = /etc/pacman.d/extra
#Include = /etc/pacman.d/unstable
diff --git a/scripts/gensync b/scripts/gensync
index a1e85f90..bdadc30b 100755
--- a/scripts/gensync
+++ b/scripts/gensync
@@ -20,7 +20,7 @@
# USA.
#
-myver='2.8.3'
+myver='2.8.4'
usage() {
echo "gensync $myver"
@@ -30,8 +30,8 @@ usage() {
echo "from <root>. gensync builds the database in a temporary directory"
echo "and then compresses it to <destfile>."
echo
- echo "gensync will calculate md5sums of packages in <destdir>, unless an"
- echo "alternate [package_directory] is specified."
+ echo "gensync will calculate md5sums of packages in the same directory as"
+ echo "<destfile>, unless an alternate [package_directory] is specified."
echo
echo "note: The <destfile> name is important. It must be of the form"
echo " {treename}.db.tar.gz where {treename} is the name of the custom"
@@ -67,7 +67,7 @@ db_write_entry()
unset groups replaces provides depends conflicts
source $1 || return 1
cd $gstmpdir
- mkdir $pkgname-$pkgver-$pkgrel
+ mkdir $pkgname-$pkgver-$pkgrel || return 1
cd $pkgname-$pkgver-$pkgrel
# desc
: >desc
diff --git a/scripts/makepkg b/scripts/makepkg
index 3497d16b..8f4103e5 100755
--- a/scripts/makepkg
+++ b/scripts/makepkg
@@ -20,7 +20,7 @@
# USA.
#
-myver='2.8.3'
+myver='2.8.4'
startdir=`pwd`
PKGDEST=$startdir
USE_COLOR="n"
@@ -611,7 +611,7 @@ if [ "$PACKAGER" != "" ]; then
else
packager="Arch Linux (http://www.archlinux.org)"
fi
-size=`du -cb $startdir/pkg | tail -1 | awk '{print $1}'`
+size=`du -cb $startdir/pkg | tail -n 1 | awk '{print $1}'`
# write the .PKGINFO file
msg "Generating .PKGINFO file..."
diff --git a/scripts/makeworld b/scripts/makeworld
index 45757977..249ae813 100755
--- a/scripts/makeworld
+++ b/scripts/makeworld
@@ -21,7 +21,7 @@
#
toplevel=`pwd`
-version="2.8.3"
+version="2.8.4"
usage() {
echo "makeworld version $version"
diff --git a/scripts/updatesync b/scripts/updatesync
new file mode 100755
index 00000000..bc17addf
--- /dev/null
+++ b/scripts/updatesync
@@ -0,0 +1,221 @@
+#!/bin/bash
+#
+# updatesync
+#
+# Copyright (c) 2004 by Jason Chu <jason@archlinux.org>
+# Derived from gensync (c) 2002-2004 Judd Vinet <jvinet@zeroflux.org>
+#
+# 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; either version 2 of the License, or
+# (at your option) any later version.
+#
+# 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.
+#
+
+myver='2.8.4'
+
+usage() {
+ echo "updatesync $myver"
+ echo "usage: $0 <action> <destfile> <option> [package_directory]"
+ echo
+ echo "updatesync will update a sync database by reading a PKGBUILD and"
+ echo "modifying the destfile. updatesync updates the database in a temporary"
+ echo "directory and then compresses it to <destfile>."
+ echo
+ echo "There are two types of actions:"
+ echo
+ echo "upd - Will update a package's entry or create it if it doesn't exist."
+ echo " It takes the package's PKGBUILD as an option."
+ echo "del - Will remove a package's entry from the db."
+ echo " It takes the package's name as an option."
+ echo
+ echo "updatesync will calculate md5sums of packages in the same directory as"
+ echo "<destfile>, unless an alternate [package_directory] is specified."
+ echo
+ echo "example: updatesync upd /home/mypkgs/custom.db.tar.gz PKGBUILD"
+ echo
+ echo
+ exit 0
+}
+
+die()
+{
+ echo "updatesync: $*" >&2
+ rm -rf $ustmpdir
+ exit 1
+}
+
+get_md5checksum()
+{
+ source $1 || return 1
+ if [ "$pkgdir" != "" ]; then
+ pkgfile="$pkgdir/$pkgname-$pkgver-$pkgrel.pkg.tar.gz"
+ else
+ pkgfile="$destdir/$pkgname-$pkgver-$pkgrel.pkg.tar.gz"
+ fi
+ if [ -f $pkgfile ]; then
+ md5line=`md5sum $pkgfile`
+ [ ! -z "$md5line" ] && pkgmd5sum=${md5line% *}
+ echo $pkgmd5sum
+ fi
+ return 0
+}
+
+db_write_entry()
+{
+ unset pkgname pkgver pkgrel pkgdesc force
+ unset groups replaces provides depends conflicts
+ source $1 || return 1
+ cd $ustmpdir
+ mkdir $pkgname-$pkgver-$pkgrel || return 1
+ cd $pkgname-$pkgver-$pkgrel
+ # desc
+ : >desc
+ echo "%NAME%" >>desc
+ echo "$pkgname" >>desc
+ echo "" >>desc
+ echo "%VERSION%" >>desc
+ echo "$pkgver-$pkgrel" >>desc
+ echo "" >>desc
+ echo "%DESC%" >>desc
+ echo "$pkgdesc" >>desc
+ echo "" >>desc
+ if [ ! -z $pkgmd5sum ]; then
+ echo "%MD5SUM%" >>desc
+ echo "$pkgmd5sum" >>desc
+ echo "" >>desc
+ fi
+ if [ ${#groups[*]} -gt 0 ]; then
+ echo "%GROUPS%" >>desc
+ for it in "${groups[@]}"; do
+ echo "$it" >>desc
+ done
+ echo "" >>desc
+ fi
+ if [ ${#replaces[*]} -gt 0 ]; then
+ echo "%REPLACES%" >>desc
+ for it in "${replaces[@]}"; do
+ echo "$it" >>desc
+ done
+ echo "" >>desc
+ fi
+ if [ "$force" = "y" -o "$force" = "Y" ]; then
+ echo "%FORCE%" >>desc
+ echo "" >>desc
+ fi
+ # depends
+ : >depends
+ if [ ${#depends[*]} -gt 0 ]; then
+ echo "%DEPENDS%" >>depends
+ for it in "${depends[@]}"; do
+ echo "$it" >>depends
+ done
+ echo "" >>depends
+ fi
+ if [ ${#conflicts[*]} -gt 0 ]; then
+ echo "%CONFLICTS%" >>depends
+ for it in "${conflicts[@]}"; do
+ echo "$it" >>depends
+ done
+ echo "" >>depends
+ fi
+ if [ ${#provides[*]} -gt 0 ]; then
+ echo "%PROVIDES%" >>depends
+ for it in "${provides[@]}"; do
+ echo "$it" >>depends
+ done
+ echo "" >>depends
+ fi
+}
+
+delete_entry()
+{
+ echo $1 | grep PKGBUILD 2>&1 >/dev/null
+ if [ $? -eq 0 ]; then
+ source $1
+ else
+ pkgname=$1
+ fi
+ for i in *; do
+ if [ "${i%-*-*}" = "$pkgname" ]; then
+ echo "updatesync: deleting $i" >&2
+ rm -rf $i
+ fi
+ done
+}
+
+if [ $# -lt 3 ]; then
+ usage
+ exit 0
+fi
+
+if [ "$1" = "-h" -o "$1" = "--help" ]; then
+ usage
+ exit 0
+fi
+
+action=$1
+pkgdb=$2
+option=$3
+curdir="`pwd`"
+pkgdir=$curdir
+if [ "$4" != "" ]; then
+ pkgdir=$4
+fi
+
+if [ "$action" != "upd" -a "$action" != "del" ]; then
+ usage
+ exit 1
+fi
+
+ustmpdir=$(mktemp -dt updatesync.XXXXXXXXXX) || exit 1
+
+cd $ustmpdir
+if [ ! -f $pkgdb ]; then
+ if [ ! -f $curdir/$pkgdb ]; then
+ echo "updatesync: $pkgdb not found"
+ exit 1
+ fi
+ pkgdb=$curdir/$pkgdb
+fi
+
+if [ "$action" = "upd" -a ! -f $option ]; then
+ if [ ! -f $curdir/$option ]; then
+ echo "updatesync: $option not found"
+ exit 1
+ fi
+ option=$curdir/$option
+fi
+
+echo "updatesync: uncompressing to $ustmpdir..." >&2
+tar -xzf $pkgdb || die "error uncompressing $pkgdb"
+if [ "$action" = "upd" ]; then
+ # INSERT / UPDATE
+ delete_entry $option
+
+ pkgmd5sum=`get_md5checksum $option`
+ [ -z $pkgmd5sum ] && die "error generating checksum for $option"
+ echo "updatesync: creating entry for $option" >&2
+ db_write_entry $option || die "error writing entry for $option"
+else
+ # DELETE
+ delete_entry $option
+fi
+
+echo "updatesync: compressing to $pkgdb..." >&2
+cd $ustmpdir
+tar c * | gzip -9 >$pkgdb || die "error writing to $pkgdb"
+
+cd $curdir
+rm -rf $ustmpdir
+
+exit 0
diff --git a/src/db.c b/src/db.c
index 0d177e6a..428b99e7 100644
--- a/src/db.c
+++ b/src/db.c
@@ -61,44 +61,21 @@ void db_close(pacdb_t* db)
return;
}
+
/* frees pkgcache if necessary and returns a new package
* cache from db
*/
PMList* db_loadpkgs(pacdb_t *db)
{
pkginfo_t *info;
- pkginfo_t **arr = NULL;
- unsigned int arrct = 0;
- int i;
PMList *cache = NULL;
rewinddir(db->dir);
while((info = db_scan(db, NULL, INFRQ_DESC | INFRQ_DEPENDS)) != NULL) {
/* add to the collective */
- /* we load all package names into a linear array first, so qsort can handle it */
- if(arr == NULL) {
- arr = (pkginfo_t**)malloc(sizeof(pkginfo_t*));
- arrct++;
- } else {
- arr = (pkginfo_t**)realloc(arr, (++arrct)*sizeof(pkginfo_t*));
- }
- if(arr == NULL) {
- fprintf(stderr, "error: out of memory\n");
- exit(1);
- }
- arr[arrct-1] = info;
+ cache = list_add_sorted(cache, info, pkgcmp);
}
- /* sort the package list */
- qsort(arr, (size_t)arrct, sizeof(pkginfo_t*), pkgcmp);
-
- /* now load them into the proper PMList */
- for(i = 0; i < arrct; i++) {
- cache = list_add(cache, arr[i]);
- }
-
- FREE(arr);
-
return(cache);
}
@@ -645,7 +622,7 @@ PMList* db_find_conflicts(pacdb_t *db, PMList *targets, char *root)
if(dbpkg2 && !is_in(filestr, p1->files) && is_in(filestr, dbpkg2->files)) {
ok = 1;
}
- FREE(dbpkg2);
+ FREEPKG(dbpkg2);
}
}
}
diff --git a/src/list.c b/src/list.c
index 41d36d6a..b07e347f 100644
--- a/src/list.c
+++ b/src/list.c
@@ -223,4 +223,37 @@ void list_display(const char *title, PMList *list)
}
}
+
+/* Add items to a list in sorted order. Use the given
+ * comparision func to determine order.
+ */
+PMList* list_add_sorted(PMList *list, void *data, cmp_fn sortfunc)
+{
+ PMList *add;
+ PMList *prev = NULL;
+ PMList *iter = list;
+
+ add = list_new();
+ add->data = data;
+
+ /* Find insertion point. */
+ while(iter) {
+ if(sortfunc(add->data, iter->data) <= 0) break;
+ prev = iter;
+ iter = iter->next;
+ }
+
+ /* Insert node before insertion point. */
+ add->prev = prev;
+ add->next = iter;
+ if(iter != NULL) iter->prev = add; /* Not at end. */
+ if(prev != NULL) {
+ prev->next = add; /* In middle. */
+ } else {
+ list = add; /* Start or empty, new list head. */
+ }
+
+ return(list);
+}
+
/* vim: set ts=2 sw=2 noet: */
diff --git a/src/list.h b/src/list.h
index 4d24570b..5d330fe1 100644
--- a/src/list.h
+++ b/src/list.h
@@ -30,6 +30,11 @@ typedef struct __pmlist_t {
struct __pmlist_t* next;
} PMList;
+
+/* Sort comparison callback function declaration. */
+typedef int (*cmp_fn) (const void *, const void *);
+
+
PMList* list_new();
void list_free(PMList* list);
PMList* list_add(PMList* list, void* data);
@@ -42,6 +47,8 @@ int list_strcmp(const void *s1, const void *s2);
PMList *list_sort(PMList *list);
void list_display(const char *title, PMList *list);
+PMList* list_add_sorted(PMList *list, void *data, cmp_fn sortfunc);
+
#endif
/* vim: set ts=2 sw=2 noet: */
diff --git a/src/package.c b/src/package.c
index 435d18d2..992110b9 100644
--- a/src/package.c
+++ b/src/package.c
@@ -284,10 +284,10 @@ void freepkg(pkginfo_t *pkg)
*/
int pkgcmp(const void *p1, const void *p2)
{
- pkginfo_t **pkg1 = (pkginfo_t**)p1;
- pkginfo_t **pkg2 = (pkginfo_t**)p2;
+ pkginfo_t *pkg1 = (pkginfo_t*)p1;
+ pkginfo_t *pkg2 = (pkginfo_t*)p2;
- return(strcmp(pkg1[0]->name, pkg2[0]->name));
+ return(strcmp(pkg1->name, pkg2->name));
}
/* Test for existence of a package in a PMList*
diff --git a/src/pacman.c b/src/pacman.c
index 4d06dd32..df0c7454 100644
--- a/src/pacman.c
+++ b/src/pacman.c
@@ -115,6 +115,7 @@ int main(int argc, char *argv[])
char *ptr = NULL;
pacdb_t *db_local = NULL;
char *cenv = NULL;
+ uid_t myuid;
cenv = getenv("COLUMNS");
if(cenv) {
@@ -144,6 +145,13 @@ int main(int argc, char *argv[])
return(ret);
}
+ /* see if we're root or not */
+ myuid = geteuid();
+ if(!myuid && getenv("FAKEROOTKEY")) {
+ /* fakeroot doesn't count, we're non-root */
+ myuid = 99;
+ }
+
/* check for permission */
pm_access = READ_ONLY;
if(pmo_op != PM_MAIN && pmo_op != PM_QUERY && pmo_op != PM_DEPTEST) {
@@ -151,7 +159,7 @@ int main(int argc, char *argv[])
(pmo_s_search || pmo_s_printuris || pmo_group || pmo_q_list || pmo_q_info)) {
/* special case: PM_SYNC can be used w/ pmo_s_search by any user */
} else {
- if(geteuid() != 0) {
+ if(myuid) {
fprintf(stderr, "error: you cannot perform this operation unless you are root.\n");
return(1);
}
@@ -178,7 +186,7 @@ int main(int argc, char *argv[])
if(pmo_usesyslog) {
openlog("pacman", 0, LOG_USER);
}
- if(pmo_logfile && geteuid() == 0) {
+ if(pmo_logfile && myuid == 0) {
/* open the log file */
logfd = fopen(pmo_logfile, "a");
if(logfd == NULL) {
@@ -1664,7 +1672,6 @@ int pacman_add(pacdb_t *db, PMList *targets)
/* see if this is an upgrade. if so, remove the old package first */
if(pmo_upgrade) {
if(is_pkgin(info, pm_packages)) {
- PMList* tmp = list_new();
int retcode;
printf("upgrading %s... ", info->name);
@@ -1701,10 +1708,10 @@ int pacman_add(pacdb_t *db, PMList *targets)
}
if(oldpkg) {
- list_add(tmp, strdup(info->name));
+ PMList* tmp = list_add(NULL, strdup(info->name));
vprint("removing old package first...\n");
retcode = pacman_remove(db, tmp);
- list_free(tmp);
+ FREELIST(tmp);
if(retcode == 1) {
fprintf(stderr, "\nupgrade aborted.\n");
return(1);
diff --git a/src/pacman.h b/src/pacman.h
index 157cb623..d7f30fc3 100644
--- a/src/pacman.h
+++ b/src/pacman.h
@@ -22,7 +22,7 @@
#define _PAC_PACMAN_H
#ifndef PACVER
-#define PACVER "2.8.3"
+#define PACVER "2.8.4"
#endif
#ifndef PKGDIR
diff --git a/src/util.c b/src/util.c
index 9a835065..d9814210 100644
--- a/src/util.c
+++ b/src/util.c
@@ -33,7 +33,7 @@
#include "util.h"
/* borrowed and modified from Per Liden's pkgutils (http://crux.nu) */
-int gzopen_frontend(char *pathname, int oflags, int mode)
+long gzopen_frontend(char *pathname, int oflags, int mode)
{
char* gzoflags;
int fd;
@@ -63,7 +63,7 @@ int gzopen_frontend(char *pathname, int oflags, int mode)
return -1;
}
- return (int)gzf;
+ return (long)gzf;
}
int unpack(char *archive, const char *prefix, const char *fn)
diff --git a/src/util.h b/src/util.h
index 9ec918de..71292bc2 100644
--- a/src/util.h
+++ b/src/util.h
@@ -28,7 +28,7 @@
#define FREE(p) { if (p) { free(p); (p)= NULL; }}
-int gzopen_frontend(char *pathname, int oflags, int mode);
+long gzopen_frontend(char *pathname, int oflags, int mode);
int unpack(char *archive, const char *prefix, const char *fn);
int copyfile(char *src, char *dest);
int makepath(char *path);