From owner-freebsd-bugs Fri Mar 8 5:20:22 2002 Delivered-To: freebsd-bugs@hub.freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.org [216.136.204.21]) by hub.freebsd.org (Postfix) with ESMTP id D812037B404 for ; Fri, 8 Mar 2002 05:20:02 -0800 (PST) Received: (from gnats@localhost) by freefall.freebsd.org (8.11.6/8.11.6) id g28DK2G66202; Fri, 8 Mar 2002 05:20:02 -0800 (PST) (envelope-from gnats) Date: Fri, 8 Mar 2002 05:20:02 -0800 (PST) Message-Id: <200203081320.g28DK2G66202@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org Cc: From: Mark Hannon Subject: Re: bin/34007: pkg_create -b forgets to include install scripts Reply-To: Mark Hannon Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org The following reply was made to PR bin/34007; it has been noted by GNATS. From: Mark Hannon To: freebsd-gnats-submit@FreeBSD.org, olgeni@uli.it Cc: Subject: Re: bin/34007: pkg_create -b forgets to include install scripts Date: Sat, 09 Mar 2002 00:19:35 +1100 This is a multi-part message in MIME format. --------------5C0AF1159856F2BC17D7793D Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Please try these patches. /mark --------------5C0AF1159856F2BC17D7793D Content-Type: text/plain; charset=us-ascii; name="pkg_install.3" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="pkg_install.3" Index: lib/lib.h =================================================================== RCS file: /home/ncvs/src/usr.sbin/pkg_install/lib/lib.h,v retrieving revision 1.29.2.9 diff -c -r1.29.2.9 lib.h *** lib/lib.h 2001/10/24 10:06:56 1.29.2.9 --- lib/lib.h 2002/03/08 13:17:11 *************** *** 112,118 **** typedef struct _plist *PackingList; struct _pack { ! struct _plist *head, *tail; int fmtver_maj, fmtver_mnr; }; typedef struct _pack Package; --- 112,118 ---- typedef struct _plist *PackingList; struct _pack { ! struct _plist *current, *head, *tail; int fmtver_maj, fmtver_mnr; }; typedef struct _pack Package; *************** *** 174,179 **** --- 174,180 ---- PackingList new_plist_entry(void); PackingList last_plist(Package *); PackingList find_plist(Package *, plist_t); + PackingList find_plist_next(Package *, plist_t); char *find_plist_option(Package *, const char *name); void plist_delete(Package *, Boolean, plist_t, const char *); void free_plist(Package *); Index: lib/plist.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/pkg_install/lib/plist.c,v retrieving revision 1.29.2.6 diff -c -r1.29.2.6 plist.c *** lib/plist.c 2001/10/24 10:06:56 1.29.2.6 --- lib/plist.c 2002/03/08 13:17:12 *************** *** 84,98 **** } /* Find a given item in a packing list and, if so, return it (else NULL) */ ! PackingList find_plist(Package *pkg, plist_t type) { PackingList p = pkg->head; while (p) { ! if (p->type == type) return p; p = p->next; } return NULL; } --- 84,127 ---- } /* Find a given item in a packing list and, if so, return it (else NULL) */ ! PackingList find_plist(Package *pkg, plist_t type) { PackingList p = pkg->head; while (p) { ! if (p->type == type){ ! pkg->current = p; return p; + } p = p->next; + } + return NULL; + } + + /* + * Find the next given item in a packing list and, if so, return it (else NULL) + * Unlike the previous function, this version pre-increments the current pointer + * before returning a value, this means that the function may be called several + * times and it will continue to return a valid value for each matching plist_t + * + * This function MAY ONLY be called immediately after getting a non NULL result + * from a call to find_plist, ie call find_plist to initialize and then iterate + * with find_plist_next. + */ + PackingList + find_plist_next(Package *pkg, plist_t type) + { + PackingList p; + + p = pkg->current; + + while (p) { + p = p->next; + if (p && p->type == type){ + pkg->current = p; + return p; + } } return NULL; } --------------5C0AF1159856F2BC17D7793D Content-Type: text/plain; charset=us-ascii; name="pkg_install.4" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="pkg_install.4" Index: create/create.h =================================================================== RCS file: /home/ncvs/src/usr.sbin/pkg_install/create/create.h,v retrieving revision 1.15.2.4 diff -c -r1.15.2.4 create.h *** create/create.h 2001/10/23 09:16:03 1.15.2.4 --- create/create.h 2002/03/08 13:16:07 *************** *** 47,51 **** void check_list(const char *, Package *); int pkg_perform(char **); void copy_plist(const char *, Package *); - #endif /* _INST_CREATE_H_INCLUDE */ --- 47,50 ---- Index: create/perform.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/pkg_install/create/perform.c,v retrieving revision 1.49.2.11 diff -c -r1.49.2.11 perform.c *** create/perform.c 2002/01/18 08:37:46 1.49.2.11 --- create/perform.c 2002/03/08 13:16:08 *************** *** 37,45 **** --- 37,53 ---- static void sanity_check(void); static void make_dist(const char *, const char *, const char *, Package *); static int create_from_installed(const char *, const char *); + static void is_a_special_file(const char *name); static char *home; + char *Display; + char *Install; + char *PostInstall; + char *DeInstall; + char *PostDeInstall; + char *Mtree; + int pkg_perform(char **pkgs) { *************** *** 413,418 **** --- 421,427 ---- { FILE *fp; Package plist; + PackingList plistp; char homedir[MAXPATHLEN], log_dir[FILENAME_MAX]; snprintf(log_dir, sizeof(log_dir), "%s/%s", LOG_DIR, InstalledPkg); *************** *** 436,443 **** --- 445,503 ---- read_plist(&plist, fp); fclose(fp); + /* + * Given that we are building the package in-situ we need + * to check the package contents definition of the installed + * package instead of relying upon command line arguments + * for install, post-install etc. scripts. + */ + + if ( (plistp = find_plist(&plist, PLIST_FILE)) != NULL ){ + is_a_special_file(plistp->name); + while ( (plistp = find_plist_next(&plist, PLIST_FILE)) != NULL ){ + is_a_special_file(plistp->name); + } + } + make_dist(homedir, pkg, suf, &plist); free_plist(&plist); return TRUE; + } + + /* + * Check the filename received from the plist and check if + * it matches one of the 'special' files. If so, then set + * the appropriate variable to a non-NULL pointer value + */ + + void + is_a_special_file(const char *filename){ + + char fake_argument[10]; /* To provide a ptr to pass */ + + if ( strcmp(INSTALL_FNAME, filename) == 0 + && Install == NULL) + Install = fake_argument; + if ( strcmp(POST_INSTALL_FNAME, filename) == 0 + && PostInstall == NULL) + PostInstall = fake_argument; + if ( strcmp(DEINSTALL_FNAME, filename) == 0 + && DeInstall == NULL) + DeInstall = fake_argument; + if ( strcmp(POST_DEINSTALL_FNAME, filename) == 0 + && PostDeInstall == NULL ) + PostDeInstall = fake_argument; + if ( strcmp(REQUIRE_FNAME, filename) == 0 + && Require == NULL ) + Require = fake_argument; + if ( strcmp(DISPLAY_FNAME, filename) == 0 + && Display == NULL ) + Display = fake_argument; + if ( strcmp(MTREE_FNAME, filename) == 0 + && Mtree == NULL ) + Mtree = fake_argument; + + return; + } --------------5C0AF1159856F2BC17D7793D-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message