summaryrefslogtreecommitdiff
path: root/lib/cpio.c
diff options
context:
space:
mode:
authorjbj <devnull@localhost>2001-02-09 20:58:37 +0000
committerjbj <devnull@localhost>2001-02-09 20:58:37 +0000
commitd991f23281c6e80b323f762c0138689679bbb32b (patch)
tree7d9a4c4618e9bc0f8b03862254a6d349af7d1baa /lib/cpio.c
parent2f9fa168c803e4ddbb20021a128f759da553bd06 (diff)
downloadrpm-d991f23281c6e80b323f762c0138689679bbb32b.tar.gz
rpm-d991f23281c6e80b323f762c0138689679bbb32b.tar.bz2
rpm-d991f23281c6e80b323f762c0138689679bbb32b.zip
fix: make a copy of retrieved header before loading.
handle out-of-sync hardlinks as sub-state, don't save the file name. fix: on build, was broke, add --fsmdebug as well. CVS patchset: 4537 CVS date: 2001/02/09 20:58:37
Diffstat (limited to 'lib/cpio.c')
-rw-r--r--lib/cpio.c146
1 files changed, 73 insertions, 73 deletions
diff --git a/lib/cpio.c b/lib/cpio.c
index 243615b4e..fead7f671 100644
--- a/lib/cpio.c
+++ b/lib/cpio.c
@@ -19,10 +19,6 @@
/*@access TFI_t @*/
/*@access FSM_t @*/
-#define CPIO_NEWC_MAGIC "070701"
-#define CPIO_CRC_MAGIC "070702"
-#define CPIO_TRAILER "TRAILER!!!"
-
#define alloca_strdup(_s) strcpy(alloca(strlen(_s)+1), (_s))
static /*@null@*/ void * _free(/*@only@*/ /*@null@*/ const void * this) {
@@ -37,7 +33,6 @@ int _fsm_debug = 0;
*/
struct hardLink {
/*@owned@*/ struct hardLink * next;
-/*@owned@*/ const char ** files; /* nlink of these, used by install */
/*@owned@*/ const char ** nsuffix;
/*@owned@*/ int * filex;
dev_t dev;
@@ -215,10 +210,14 @@ static /*@null@*/ void * dnlFreeIterator(/*@only@*//*@null@*/ const void * this)
return _free(this);
}
+/**
+ */
static inline int dnlCount(const DNLI_t dnli) {
return (dnli ? dnli->fi->dc : 0);
}
+/**
+ */
static inline int dnlIndex(const DNLI_t dnli) {
return (dnli ? dnli->isave : -1);
}
@@ -360,6 +359,8 @@ static int mapFind(void * this, const char * fsmPath) {
static int saveHardLink(FSM_t fsm)
{
struct stat * st = &fsm->sb;
+ int rc = 0;
+ int ix = -1;
int j;
/* Find hard link set. */
@@ -368,7 +369,7 @@ static int saveHardLink(FSM_t fsm)
break;
}
- /* New har link encountered, add new set. */
+ /* New hard link encountered, add new link to set. */
if (fsm->li == NULL) {
fsm->li = xcalloc(1, sizeof(*fsm->li));
fsm->li->next = NULL;
@@ -381,7 +382,6 @@ static int saveHardLink(FSM_t fsm)
fsm->li->filex = xcalloc(st->st_nlink, sizeof(fsm->li->filex[0]));
memset(fsm->li->filex, -1, (st->st_nlink * sizeof(fsm->li->filex[0])));
fsm->li->nsuffix = xcalloc(st->st_nlink, sizeof(*fsm->li->nsuffix));
- fsm->li->files = xcalloc(st->st_nlink, sizeof(*fsm->li->files));
if (fsm->goal == FSM_PKGBUILD)
fsm->li->linksLeft = st->st_nlink;
@@ -394,7 +394,6 @@ static int saveHardLink(FSM_t fsm)
if (fsm->goal == FSM_PKGBUILD) --fsm->li->linksLeft;
fsm->li->filex[fsm->li->linksLeft] = fsm->ix;
- fsm->li->files[fsm->li->linksLeft] = xstrdup(fsm->path);
/*@-observertrans@*/
fsm->li->nsuffix[fsm->li->linksLeft] = fsm->nsuffix;
/*@=observertrans@*/
@@ -417,23 +416,23 @@ fprintf(stderr, "*** %p link[%d:%d] %d filex %d %s\n", fsm->li, fsm->li->linksLe
{ TFI_t fi = fsmGetFi(fsm);
for (j = fsm->li->linksLeft - 1; j >= 0; j--) {
- int i;
- i = fsm->li->filex[j];
- if (i < 0 || XFA_SKIPPING(fi->actions[i]))
+ ix = fsm->li->filex[j];
+ if (ix < 0 || XFA_SKIPPING(fi->actions[ix]))
continue;
break;
}
}
/* Are all links skipped or not encountered yet? */
- if (j < 0)
+ if (ix < 0 || j < 0)
return 1; /* XXX W2DO? */
/* Save the non-skipped file name and map index. */
fsm->li->linkIndex = j;
fsm->path = _free(fsm->path);
- fsm->path = xstrdup(fsm->li->files[j]);
- return 0;
+ fsm->ix = ix;
+ rc = fsmStage(fsm, FSM_MAP);
+ return rc;
}
/**
@@ -443,15 +442,6 @@ fprintf(stderr, "*** %p link[%d:%d] %d filex %d %s\n", fsm->li, fsm->li->linksLe
static /*@null@*/ void * freeHardLink(/*@only@*/ /*@null@*/ struct hardLink * li)
{
if (li) {
- if (li->files) {
- int i;
- for (i = 0; i < li->nlink; i++) {
- /*@-unqualifiedtrans@*/
- li->files[i] = _free(li->files[i]);
- /*@=unqualifiedtrans@*/
- }
- }
- li->files = _free(li->files);
li->nsuffix = _free(li->nsuffix); /* XXX elements are shared */
li->filex = _free(li->filex);
}
@@ -731,8 +721,6 @@ fprintf(stderr, "*** %s:%s %s\n", fiTypeString(fi), fileActionString(fsm->action
break;
case FA_CREATE:
-if (_fsm_debug && !(fsm->goal == FSM_PKGINSTALL || fsm->goal == FSM_PKGCOMMIT))
-fprintf(stderr, "*** %s:%s %s\n", fiTypeString(fi), fileActionString(fsm->action), (fsm->path ? fsm->path : ""));
assert(fi->type == TR_ADDED);
break;
@@ -1001,33 +989,37 @@ static int writeLinkedFile(FSM_t fsm)
/*@modifies fsm @*/
{
const char * path = fsm->path;
- int rc = 0;
+ const char * nsuffix = fsm->nsuffix;
+ int iterIndex = fsm->ix;
+ int ec = 0;
+ int rc;
int i;
+ fsm->path = NULL;
+ fsm->nsuffix = NULL;
+ fsm->ix = -1;
+
for (i = fsm->li->nlink - 1; i >= 0; i--) {
if (fsm->li->filex[i] < 0) continue;
- if (fsm->li->files[i] == NULL) continue;
- fsm->path = fsm->li->files[i];
- fsm->li->filex[i] = -1;
- fsm->li->files[i] = NULL;
+ fsm->ix = fsm->li->filex[i];
+ rc = fsmStage(fsm, FSM_MAP);
/* Write data after last link. */
rc = writeFile(fsm, (i == 0));
- if (rc) break;
+ if (rc && fsm->failedFile && *fsm->failedFile == NULL) {
+ ec = rc;
+ *fsm->failedFile = xstrdup(fsm->path);
+ }
-#ifdef DYING
- /*@-unqualifiedtrans@*/
- fsm->li->files[i] = _free(fsm->li->files[i]);
- /*@=unqualifiedtrans@*/
-#endif
+ fsm->path = _free(fsm->path);
+ fsm->li->filex[i] = -1;
}
- if (rc && fsm->failedFile && *fsm->failedFile == NULL)
- *fsm->failedFile = xstrdup(fsm->path);
-
+ fsm->ix = iterIndex;
+ fsm->nsuffix = nsuffix;
fsm->path = path;
- return rc;
+ return ec;
}
/**
@@ -1036,40 +1028,47 @@ static int fsmMakeLinks(FSM_t fsm)
{
const char * path = fsm->path;
const char * opath = fsm->opath;
- int rc = 0;
+ const char * nsuffix = fsm->nsuffix;
+ int iterIndex = fsm->ix;
+ int ec = 0;
+ int rc;
int i;
- fsm->opath = fsm->li->files[fsm->li->createdPath];
+ fsm->path = NULL;
+ fsm->opath = NULL;
+ fsm->nsuffix = NULL;
+ fsm->ix = -1;
+
+ fsm->ix = fsm->li->filex[fsm->li->createdPath];
+ rc = fsmStage(fsm, FSM_MAP);
+ fsm->opath = fsm->path;
+ fsm->path = NULL;
for (i = 0; i < fsm->li->nlink; i++) {
if (fsm->li->filex[i] < 0) continue;
- if (fsm->li->files[i] == NULL) continue;
if (i == fsm->li->createdPath) continue;
- fsm->path = fsm->li->files[i];
+ fsm->ix = fsm->li->filex[i];
+ rc = fsmStage(fsm, FSM_MAP);
rc = fsmStage(fsm, FSM_VERIFY);
if (!rc) continue;
if (rc != CPIOERR_LSTAT_FAILED) break;
/* XXX link(fsm->opath, fsm->path) */
rc = fsmStage(fsm, FSM_LINK);
- if (rc) break;
-
-#ifdef DYING /* XXX late commit needs to rename. */
- /*@-unqualifiedtrans@*/
- fsm->li->files[i] = _free(fsm->li->files[i]);
- /*@=unqualifiedtrans@*/
-#endif
+ if (rc && fsm->failedFile && *fsm->failedFile == NULL) {
+ ec = rc;
+ *fsm->failedFile = xstrdup(fsm->path);
+ }
fsm->li->linksLeft--;
}
+ fsm->opath = _free(fsm->opath);
- if (rc && fsm->failedFile && *fsm->failedFile == NULL)
- *fsm->failedFile = xstrdup(fsm->path);
-
+ fsm->ix = iterIndex;
+ fsm->nsuffix = nsuffix;
fsm->path = path;
fsm->opath = opath;
-
- return rc;
+ return ec;
}
/**
@@ -1094,13 +1093,11 @@ static int fsmCommitLinks(FSM_t fsm)
for (i = 0; i < fsm->li->nlink; i++) {
if (fsm->li->filex[i] < 0) continue;
- if (fsm->li->files[i] == NULL) continue;
fsm->ix = fsm->li->filex[i];
rc = fsmStage(fsm, FSM_MAP);
rc = fsmStage(fsm, FSM_COMMIT);
fsm->path = _free(fsm->path);
fsm->li->filex[i] = -1;
- fsm->li->files[i] = _free(fsm->li->files[i]);
}
fsm->ix = iterIndex;
@@ -1277,14 +1274,6 @@ int fsmStage(FSM_t fsm, fileStage stage)
fsm->nsuffix = NULL;
if (fsm->goal == FSM_PKGINSTALL) {
-#ifdef DYING
- /* Detect and create directories not explicitly in package. */
- if (!fsm->mkdirsdone) {
- rc = fsmStage(fsm, FSM_MKDIRS);
- fsm->mkdirsdone = 1;
- }
-#endif
-
/* Read next header from payload, checking for end-of-payload. */
rc = fsmStage(fsm, FSM_NEXT);
}
@@ -1499,16 +1488,19 @@ int fsmStage(FSM_t fsm, fileStage stage)
if (fsm->osuffix)
fsm->path = fsmFsPath(fsm, st, NULL, NULL);
rc = fsmStage(fsm, FSM_VERIFY);
+
if (rc == 0 && fsm->osuffix) {
const char * opath = fsm->opath;
fsm->opath = fsm->path;
fsm->path = fsmFsPath(fsm, st, NULL, fsm->osuffix);
rc = fsmStage(fsm, FSM_RENAME);
-if (!rc)
-rpmMessage(RPMMESS_WARNING, _("%s saved as %s\n"), fsm->opath, fsm->path);
+ if (!rc)
+ rpmMessage(RPMMESS_WARNING,
+ _("%s saved as %s\n"), fsm->opath, fsm->path);
fsm->path = _free(fsm->path);
fsm->opath = opath;
}
+
fsm->path = path;
if (rc != CPIOERR_LSTAT_FAILED) return rc;
rc = expandRegular(fsm);
@@ -1551,7 +1543,10 @@ rpmMessage(RPMMESS_WARNING, _("%s saved as %s\n"), fsm->opath, fsm->path);
rc = fsmStage(fsm, FSM_MKFIFO);
st->st_mode = st_mode; /* XXX restore st->st_mode */
}
- } else if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode) || S_ISSOCK(st->st_mode)) {
+ } else if (S_ISCHR(st->st_mode) ||
+ S_ISBLK(st->st_mode) ||
+ S_ISSOCK(st->st_mode))
+ {
rc = fsmStage(fsm, FSM_VERIFY);
if (rc == CPIOERR_LSTAT_FAILED)
rc = fsmStage(fsm, FSM_MKNOD);
@@ -1708,13 +1703,18 @@ rpmMessage(RPMMESS_WARNING, _("%s saved as %s\n"), fsm->opath, fsm->path);
while ((fsm->li = fsm->links) != NULL) {
fsm->links = fsm->li->next;
fsm->li->next = NULL;
- if (fsm->goal == FSM_PKGINSTALL && fsm->commit && fsm->li->linksLeft) {
+ if (fsm->goal == FSM_PKGINSTALL && fsm->commit && fsm->li->linksLeft)
+ {
for (i = 0 ; i < fsm->li->linksLeft; i++) {
if (fsm->li->filex[i] < 0) continue;
rc = CPIOERR_MISSING_HARDLINK;
- if (!(fsm->li->files && fsm->li->files[i])) continue;
- if (fsm->failedFile && *fsm->failedFile == NULL)
- *fsm->failedFile = xstrdup(fsm->li->files[i]);
+ if (fsm->failedFile && *fsm->failedFile == NULL) {
+ fsm->ix = fsm->li->filex[i];
+ if (!fsmStage(fsm, FSM_MAP)) {
+ *fsm->failedFile = fsm->path;
+ fsm->path = NULL;
+ }
+ }
break;
}
}