aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/siscomponentrecord.cpp20
-rw-r--r--lib/siscomponentrecord.h7
-rw-r--r--lib/sisfile.cpp15
-rw-r--r--lib/sisfile.h13
-rw-r--r--sisinstall/sisinstaller.cpp23
5 files changed, 54 insertions, 24 deletions
diff --git a/lib/siscomponentrecord.cpp b/lib/siscomponentrecord.cpp
index 3507bce..ac5ba6d 100644
--- a/lib/siscomponentrecord.cpp
+++ b/lib/siscomponentrecord.cpp
@@ -35,12 +35,15 @@ SISComponentNameRecord::~SISComponentNameRecord()
}
SisRC
-SISComponentNameRecord::fillFrom(uint8_t* buf, int base, off_t len,
+SISComponentNameRecord::fillFrom(uint8_t* buf, int* basePos, off_t len,
SISFile* sisFile)
{
int n = sisFile->m_header.m_nlangs;
- if (base + 8 + n * 4 * 2 > len)
+ int base = *basePos;
+ int entrySize = 8 + n * 4 * 2;
+ if (base + entrySize > len)
return SIS_TRUNCATED;
+ *basePos += entrySize;
uint8_t* p = buf + base;
int size = 0;
@@ -90,6 +93,19 @@ SISComponentNameRecord::fillFrom(uint8_t* buf, int base, off_t len,
return SIS_OK;
}
+uint32_t
+SISComponentNameRecord::getLastEnd()
+{
+ uint32_t last = 0;
+ for (int i = 0; i < m_nameCount; ++i)
+ {
+ uint32_t pos = m_namePtrs[i] + m_nameLengths[i];
+ if (last < pos)
+ last = pos;
+ }
+ return last;
+}
+
uint8_t*
SISComponentNameRecord::getName(int no)
{
diff --git a/lib/siscomponentrecord.h b/lib/siscomponentrecord.h
index f2bc734..1fc4ff3 100644
--- a/lib/siscomponentrecord.h
+++ b/lib/siscomponentrecord.h
@@ -50,7 +50,12 @@ public:
* @param len The length of the buffer, for range checking.
* @param sisFile The container sis file.
*/
- SisRC fillFrom(uint8_t* buf, int base, off_t len, SISFile* sisFile);
+ SisRC fillFrom(uint8_t* buf, int* base, off_t len, SISFile* sisFile);
+
+ /**
+ * Find out the end position for the last name in the file.
+ */
+ uint32_t getLastEnd();
/**
* Return the name for the given language.
diff --git a/lib/sisfile.cpp b/lib/sisfile.cpp
index df60695..97fde1d 100644
--- a/lib/sisfile.cpp
+++ b/lib/sisfile.cpp
@@ -49,6 +49,7 @@ SISFile::compareApp(SISFile* other)
SisRC
SISFile::fillFrom(uint8_t* buf, off_t len)
{
+ m_end = 0;
int ix = 0;
m_buf = buf;
SisRC rc = m_header.fillFrom(buf, &ix, len);
@@ -77,6 +78,7 @@ SISFile::fillFrom(uint8_t* buf, off_t len)
return rc;
}
}
+ updateEnd(ix);
// Read requisites.
//
@@ -94,11 +96,14 @@ SISFile::fillFrom(uint8_t* buf, off_t len)
return rc;
}
}
+ updateEnd(ix);
// Read component names, by language.
//
ix = m_header.m_componentPtr;
- rc = m_componentRecord.fillFrom(buf, ix, len, this);
+ rc = m_componentRecord.fillFrom(buf, &ix, len, this);
+ updateEnd(ix);
+ updateEnd(m_componentRecord.getLastEnd());
if (rc != SIS_OK)
{
printf(_("Problem reading the name record, rc = %d.\n"), rc);
@@ -125,6 +130,7 @@ SISFile::fillFrom(uint8_t* buf, off_t len)
return rc;
}
}
+ updateEnd(ix);
return SIS_OK;
}
@@ -165,3 +171,10 @@ SISFile::setLanguage(int lang)
m_header.m_installationLanguage = lang;
}
+void
+SISFile::updateEnd(uint32_t pos)
+{
+ if (m_end < pos)
+ m_end = pos;
+}
+
diff --git a/lib/sisfile.h b/lib/sisfile.h
index d74cc1c..bb33570 100644
--- a/lib/sisfile.h
+++ b/lib/sisfile.h
@@ -74,6 +74,15 @@ public:
*/
uint8_t* getName();
+ /**
+ * Get the number of bytes that should be copied to the residual sis
+ * file on the psion.
+ */
+ uint32_t getResidualEnd()
+ {
+ return m_end;
+ }
+
void ownBuffer()
{
m_ownBuffer = true;
@@ -112,6 +121,10 @@ private:
uint8_t* m_buf;
+ uint32_t m_end;
+
+ void updateEnd(uint32_t pos);
+
};
#endif
diff --git a/sisinstall/sisinstaller.cpp b/sisinstall/sisinstaller.cpp
index e23baed..aed67f0 100644
--- a/sisinstall/sisinstaller.cpp
+++ b/sisinstall/sisinstaller.cpp
@@ -654,7 +654,6 @@ SISInstaller::run(SISFile* file, uint8_t* buf, off_t len, SISFile* parent)
fprintf(stderr, "Found %d files.\n", n);
m_drive = (parent == 0) ? 0 : parent->m_header.m_installationDrive;
int nCopiedFiles = 0;
- int firstFile = -1;
m_lastSisFile = 0;
bool skipnext = false;
bool aborted = false;
@@ -662,19 +661,6 @@ SISInstaller::run(SISFile* file, uint8_t* buf, off_t len, SISFile* parent)
{
SISFileRecord* fileRecord = &m_file->m_fileRecords[n];
m_fileNo = (fileRecord->m_flags & 1) ? lang : 0;
- char ch;
-#if 0
- printf("FirstFile = %d, ptr = %d, length = %d\n",
- firstFile,
- fileRecord->m_filePtrs[m_fileNo],
- fileRecord->m_fileLengths[m_fileNo]);
-#endif
- int fileIx = fileRecord->getFilePtr(m_fileNo) - m_buf;
- if ((firstFile == -1) || (firstFile >= fileIx))
- firstFile = fileIx;
-
-// We can only do this if we search all files...
-// fileRecord->m_filePtrs[m_fileNo] + fileRecord->m_fileLengths[m_fileNo]
if (skipnext)
{
@@ -700,13 +686,10 @@ SISInstaller::run(SISFile* file, uint8_t* buf, off_t len, SISFile* parent)
m_file->setFiles(nCopiedFiles);
if (logLevel >= 1)
fprintf(stderr,
- "Installed %d files of %d, cutting at offset max(%d,%d)\n",
+ "Installed %d files of %d, cutting at offset %d.\n",
m_file->m_header.m_installationFiles,
m_file->m_header.m_nfiles,
- firstFile,
- m_lastSisFile);
- if (firstFile < m_lastSisFile)
- firstFile = m_lastSisFile;
+ m_file->getResidualEnd());
if (nCopiedFiles == 0)
{
// There is no need to copy any uninstall information to the
@@ -728,7 +711,7 @@ SISInstaller::run(SISFile* file, uint8_t* buf, off_t len, SISFile* parent)
sprintf(resname, "C:\\System\\Install\\%.*s.sis", namelen, compName);
if (logLevel >= 1)
fprintf(stderr, "Creating residual sis file %s\n", resname);
- copyBuf(buf, firstFile, resname);
+ copyBuf(buf, m_file->getResidualEnd(), resname);
#if HAVE_LIBNEWT
if (m_useNewt)
{