plptools
Loading...
Searching...
No Matches
sisinstaller.cpp
Go to the documentation of this file.
1/*
2 * This file is part of plptools.
3 *
4 * Copyright (C) 2002 Daniel Brahneborg <basic@chello.se>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * along with this program; if not, see <https://www.gnu.org/licenses/>.
18 *
19 */
20
21#include "config.h"
22
23#include "sisinstaller.h"
24
25#include "sisfile.h"
26#include "sisfilelink.h"
27#include "sisfilerecord.h"
28#include "sisreqrecord.h"
29#include "psion.h"
30
31#include <cstdlib>
32#include <errno.h>
33#include <unistd.h>
34#include <stdio.h>
35#include <stdbool.h>
36#include <sys/types.h>
37
38#include "ignore-value.h"
39
40static int continueRunning;
41
42static int
43checkAbortHash(void *, uint32_t)
44{
46 {
47 if (logLevel >= 1)
48 {
49 printf("#");
50 fflush(stdout);
51 }
52 }
53 return continueRunning;
54}
55
57{
58 m_installed = nullptr;
59 m_ownInstalled = false;
60}
61
63{
65 {
67 while (curr)
68 {
69 delete curr->m_file;
70 SISFileLink* next = curr->m_next;
71 delete curr;
72 curr = next;
73 }
74 }
75}
76
77void
79{
80 char* end = filename + strlen(filename);
81 while (--end > filename)
82 {
83 char ch = *end;
84 if ((ch == '/') || (ch == '\\'))
85 {
86 *end = 0;
87 if (logLevel >= 1)
88 fprintf(stderr, "Checking for existance of %s\n", filename);
89// if (!m_psion->dirExists(filename))
90 {
91 if (logLevel >= 1)
92 fprintf(stderr, "Creating dir %s\n", filename);
94 res = m_psion->mkdir(filename);
95 if ((res != rfsv::E_PSI_GEN_NONE) &&
97 {
98 fprintf(stderr, " -> Failed: %s\n", (const char*)res);
99 }
100 }
101 *end = ch;
102 return;
103 }
104 }
105}
106
107void
109{
110 uint8_t* destptr = fileRecord->getDestPtr();
111 if (destptr == nullptr)
112 return;
113 if (destptr[0] == '!')
114 {
115 if (m_drive == 0)
116 selectDrive();
118 }
119 int len = fileRecord->m_destLength;
120 char dest[256];
121 memcpy(dest, destptr, len);
122 dest[len] = 0;
123 if (dest[0] == '!')
124 {
125 dest[0] = m_drive;
126 fileRecord->setMainDrive(m_drive);
127 if (logLevel >= 2)
128 fprintf(stderr, "Setting main drive to %c\n", m_drive);
129 }
130
131 char msgbuf[1024];
132 sprintf(msgbuf,
133 "Copying %u bytes to %s\n",
134 fileRecord->m_fileLengths[m_fileNo], dest);
135 {
136 printf("%s\n", msgbuf);
137 }
138
139 copyBuf(fileRecord->getFilePtr(m_fileNo),
140 fileRecord->m_fileLengths[m_fileNo],
141 dest);
142
143}
144
145void
146SISInstaller::copyBuf(const uint8_t* buf, int len, char* name)
147{
148 createDirs(name);
149 char srcName[32];
150 strcpy(srcName, "/tmp/plptools-sis-XXXXXX");
151 int fd = mkstemp(srcName);
152 if (-1 == fd)
153 {
154 fprintf(stderr,
155 "Couldn't create temp file: %s\n", strerror(errno));
156 return;
157 }
159 if (logLevel >= 2)
160 fprintf(stderr, "Storing in %s\n", srcName);
161 ssize_t written = write(fd, buf, len);
162 int close_res = close(fd);
163 bool write_ok = written == len && close_res == 0;
164 if (write_ok) {
165 continueRunning = 1;
166 res = m_psion->copyToPsion(srcName, name, NULL, checkAbortHash);
167 }
168 if (write_ok && res == rfsv::E_PSI_GEN_NONE)
169 {
170 if (logLevel >= 1)
171 fprintf(stderr, " -> Success.\n");
172 }
173 else
174 {
175 fprintf(stderr, " -> Fail: %s\n", (const char*)res);
176 }
177 unlink(srcName);
178}
179
180int
182{
183 char readbuf[8];
184 switch (fileRecord->m_fileType)
185 {
186 case 0:
187 copyFile(fileRecord);
188 break;
189 case 1:
190
191 {
192 printf("Info:\n%.*s\n",
193 (int) fileRecord->m_fileLengths[m_fileNo],
194 fileRecord->getFilePtr(m_fileNo));
195 switch (fileRecord->m_fileDetails)
196 {
197 case 0:
198 printf("Continue\n");
199 ignore_value(fgets(readbuf, sizeof(readbuf), stdin));
200 break;
201 case 1: {
202 printf("(Install next file?) [Y]es/No\n");
203 char *res = fgets(readbuf, sizeof(readbuf), stdin);
204 if (!res || strchr("Nn", readbuf[0]))
205 {
206 return FILE_SKIP;
207 }
208 break;
209 }
210 case 2: {
211 printf("(Continue installation?) [Y]es/No\n");
212 char *res = fgets(readbuf, sizeof(readbuf), stdin);
213 if (!res || strchr("Nn", readbuf[0]))
214 {
215 // Watch out if we have copied any files
216 // already.
217 //
218 return FILE_ABORT;
219 }
220 break;
221 }
222 }
223 }
224 break;
225 case 2:
226 {
227 if (logLevel >= 1)
228 fprintf(stderr, "Recursive sis file...\n");
229 SISFile sisFile;
230 uint8_t* buf2 = fileRecord->getFilePtr(m_fileNo);
231 off_t len = fileRecord->m_fileLengths[m_fileNo];
232// if (m_lastSisFile < fileptr + len)
233// m_lastSisFile = fileptr + len;
234 SisRC rc = sisFile.fillFrom(buf2, len);
235 if (rc != SIS_OK)
236 {
237 fprintf(stderr,
238 "Could not read contained sis file, rc = %d\n", rc);
239 break;
240 }
241 SISInstaller installer;
242 installer.setPsion(m_psion);
243 installer.setInstalled(m_installed);
244 rc = installer.run(&sisFile, buf2, len, m_file);
245 if (0 == m_drive)
246 {
249 if (logLevel >= 1)
250 fprintf(stderr,
251 "Updated drive to %c from recursive sis file\n",
252 m_drive);
253 }
254 break;
255 }
256 case 3:
257 if (logLevel >= 1)
258 fprintf(stderr, "Run %.*s during installation/remove\n",
259 (int) fileRecord->m_destLength, fileRecord->getDestPtr());
260 break;
261 case 4:
262 if (logLevel >= 2)
263 fprintf(stderr, "Running the app will create %.*s\n",
264 (int) fileRecord->m_destLength, fileRecord->getDestPtr());
265 break;
266 }
267 return FILE_OK;
268}
269
270#define SYSTEMINSTALL "c:\\system\\install\\"
271
272SisRC
274{
275 PlpDir files;
277
278 if ((res = m_psion->dir(SYSTEMINSTALL, files)) != rfsv::E_PSI_GEN_NONE)
279 {
280 return SIS_FAILED;
281 }
282 else
283 {
284 while (!files.empty())
285 {
286 PlpDirent file = files[0];
287 if (logLevel >= 1)
288 fprintf(stderr, "Loading sis file `%s'\n", file.getName());
289 char sisname[256];
290 sprintf(sisname, "%s%s", SYSTEMINSTALL, file.getName());
291 loadPsionSis(sisname);
292 files.pop_front();
293 }
294 return SIS_OK;
295 }
296}
297
298void
300{
301 char srcName[32];
302 strcpy(srcName, "/tmp/plptools-sis-XXXXXX");
303 int fd = mkstemp(srcName);
304 if (-1 == fd)
305 {
306 fprintf(stderr, "Couldn't create temp file: %s\n", strerror(errno));
307 return;
308 }
310 continueRunning = 1;
311 if (logLevel >= 2)
312 fprintf(stderr, "Copying from %s to temp file %s\n", name, srcName);
313 res = m_psion->copyFromPsion(name, fd, checkAbortHash);
314 if (res == rfsv::E_PSI_GEN_NONE)
315 {
316 off_t fileLen = lseek(fd, 0, SEEK_END);
317 if (logLevel >= 2)
318 fprintf(stderr, "Read %d bytes from the Psion file %s\n",
319 (int)fileLen, name);
320 lseek(fd, SEEK_SET, 0);
321 uint8_t* sisbuf = new uint8_t[fileLen];
322 int rc = read(fd, sisbuf, fileLen);
323 if (rc == fileLen)
324 {
325 SISFile* sisFile = new SISFile();
326 SisRC rc2 = sisFile->fillFrom(sisbuf, fileLen);
327 if (rc2 == SIS_OK)
328 {
329 if (logLevel >= 1)
330 fprintf(stderr, " Ok.\n");
331 SISFileLink* link = new SISFileLink(sisFile);
332 link->m_next = m_installed;
333 m_ownInstalled = true;
334 m_installed = link;
335 sisFile->ownBuffer();
336 }
337 else
338 {
339 delete sisFile;
340 delete[] sisbuf;
341 }
342 }
343 }
344 close(fd);
345 unlink(srcName);
346}
347
348void
350{
351 int len = fileRecord->m_destLength;
352 char dest[256];
353 memcpy(dest, fileRecord->getDestPtr(), len);
354 dest[len] = 0;
355 if (logLevel >= 1)
356 fprintf(stderr, "Removing file component %s.\n", dest);
357 m_psion->remove(dest);
358}
359
360SisRC
361SISInstaller::run(SISFile* file, uint8_t* buf, off_t len)
362{
363 return run(file, buf, len, 0);
364}
365
366SisRC
367SISInstaller::run(SISFile* file, uint8_t* buf, off_t len, SISFile* parent)
368{
369 int n;
370 long lang;
371 m_file = file;
372 m_buf = buf;
373 char msgbuf[1024];
374 if (parent == 0)
375 {
377 if (n == 1)
378 {
379 sprintf(msgbuf,
380 _("You have only one language: %s"),
381 m_file->getLanguage(0)->m_name);
382 printf("%s\n", msgbuf);
383 lang = 0;
384 }
385 else
386 {
387 printf("Select a language (%d alternatives):\n", n);
388 for (int i = 0; i < n; ++i)
389 printf(" %d. %s\n", i, m_file->getLanguage(i)->m_name);
390 lang = 0;
391 }
392 }
393 else
394 {
395 // This needs to check the _name_ of the language, since the
396 // recursive sis file might have a different language list.
397 // For now, defalt to 0.
398 // lang = parent->getLanguage();
399 lang = 0;
400 if (logLevel >= 1)
401 fprintf(stderr, "Forcing language to %ld\n", lang);
402 }
403 m_file->setLanguage(lang);
404 uint8_t* compName = m_file->getName();
405 sprintf(msgbuf, _("Installing component: `%s'"), compName);
406 printf("%s\n", msgbuf);
407
408 // In order to check requisites and previous versions, we need to
409 // load all sis files from the c:/system/install directory.
410 // This is the only way to find out if a specific application or
411 // library has been loaded, since the sis file names could be just
412 // about anything.
413 //
414 if (m_installed == 0)
416
417 // Check Requisites.
418 //
420 if (logLevel >= 1)
421 fprintf(stderr, "Found %d requisites, of some sort.\n", n);
422 for (int i = 0; i < n; ++i)
423 {
424 SISReqRecord* reqRecord = &m_file->m_reqRecords[i];
425 if (logLevel >= 1)
426 fprintf(stderr,
427 " Check if app with uid %08x exists with version >= %d.%d\n",
428 reqRecord->m_uid, reqRecord->m_major, reqRecord->m_minor);
429 }
430
431 // Check previous version.
432 //
433 if (logLevel >= 1)
434 fprintf(stderr,
435 "Checking if this app (uid %08x) exists with a version less than %d.%d.\n",
439
440 bool uninstallFirst = false;
441 SISFileLink* curr = m_installed;
442 SISFile* oldFile = 0;
443 while (curr)
444 {
445 SISFile* sisFile = curr->m_file;
446 switch (sisFile->compareApp(m_file))
447 {
448 case SIS_VER_EARLIER:
449 uninstallFirst = true;
450 oldFile = sisFile;
451 break;
452
454 // Ask for confirmation.
455 uninstallFirst = true;
456 oldFile = sisFile;
457 break;
458
460 // Ask for confirmation.
461 uninstallFirst = true;
462 oldFile = sisFile;
463 break;
464 }
465 curr = curr->m_next;
466 }
467
468 if (uninstallFirst)
469 {
470// printf("You should uninstall the previous version first.\n");
471// if (!m_forced)
472// return SIS_ABORTED;
473// printf("Forced mode... Installing anyway!\n");
474 if (oldFile == 0)
475 fprintf(stderr, "Already installed, but 0?\n");
476 else
477 {
478 sprintf(msgbuf, "%s", _("Uninstalling the previous version first."));
479 printf("%s\n", msgbuf);
480 uninstall(oldFile);
481 }
482 }
483
484 // Install file components.
485 //
487 if (logLevel >= 1)
488 fprintf(stderr, "Found %d files.\n", n);
489 m_drive = (parent == 0) ? 0 : parent->m_header.m_installationDrive;
490 int nCopiedFiles = 0;
491 m_lastSisFile = 0;
492 bool skipnext = false;
493 bool aborted = false;
494 while (!aborted && (n-- > 0))
495 {
496 SISFileRecord* fileRecord = &m_file->m_fileRecords[n];
497 m_fileNo = (fileRecord->m_flags & 1) ? lang : 0;
498
499 if (skipnext)
500 {
501 skipnext = false;
502 }
503 else
504 {
505 switch (installFile(fileRecord))
506 {
507 case FILE_OK:
508 break;
509 case FILE_SKIP:
510 skipnext = true;
511 break;
512 case FILE_ABORT:
513 aborted = true;
514 break;
515 }
516 }
517 if (!aborted)
518 nCopiedFiles++;
519 }
520 m_file->setFiles(nCopiedFiles);
521 if (logLevel >= 1)
522 fprintf(stderr,
523 "Installed %d files of %d, cutting at offset %u.\n",
527 if (nCopiedFiles == 0)
528 {
529 // There is no need to copy any uninstall information to the
530 // psion, unless we've actually copied anything there.
531 //
532 return SIS_ABORTED;
533 }
534
535 // Copy the updated sis file to the epoc machine.
536 //
537 char resname[256];
538 int namelen = 0;
539 while (compName[namelen] != 0)
540 {
541 if (compName[namelen] == ' ')
542 break;
543 namelen++;
544 }
545 sprintf(resname, "C:\\System\\Install\\%.*s.sis", namelen, compName);
546 if (logLevel >= 1)
547 fprintf(stderr, "Creating residual sis file %s\n", resname);
548 copyBuf(buf, m_file->getResidualEnd(), resname);
549 if (aborted)
550 return SIS_ABORTED;
551 return SIS_OK;
552}
553
554void
556{
557 uint32_t devbits = 0;
559 char drivelist[26];
560 int ndrives = 0;
561 if ((res = m_psion->devlist(devbits)) == rfsv::E_PSI_GEN_NONE)
562 {
563 for (int i = 0; i < 26; i++)
564 {
565 PlpDrive plpdrive;
566 if (((devbits & 1) != 0) &&
567 (m_psion->devinfo(i + 'A', plpdrive) == rfsv::E_PSI_GEN_NONE))
568 {
569 uint32_t mediaType = plpdrive.getMediaType();
570 if ((mediaType == 3) || (mediaType == 5))
571 {
572 drivelist[ndrives] = 'A' + i;
573 printf("%c: %lud bytes free, %lud bytes total\n",
574 'A' + i,
575 plpdrive.getSpace(),
576 plpdrive.getSize());
577 ++ndrives;
578 }
579 }
580 devbits >>= 1;
581 }
582 }
583 drivelist[ndrives] = 0;
584 if (ndrives == 0)
585 {
586 m_drive = 'C';
587 if (logLevel >= 1)
588 printf("Selecting the only drive %c\n", m_drive);
589 }
590 else if (ndrives == 1)
591 {
592 m_drive = drivelist[0];
593 if (logLevel >= 1)
594 printf("Selecting the only drive %c\n", m_drive);
595 }
596 else
597 {
598
599 {
600 printf("Please select a drive\n");
601 char ch;
602 char readbuf[2];
603 while (m_drive == 0)
604 {
605 if (fgets(readbuf, 2, stdin) == NULL)
606 {
607 printf("please enter a drive");
608 continue;
609 }
610 ch = readbuf[0];
611 if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
612 {
613 m_drive = toupper(ch);
614 if (!strchr(drivelist, m_drive))
615 {
616 m_drive = 0;
617 printf("Please select a valid drive: %s\n", drivelist);
618 }
619 }
620 }
621 }
622
623 }
624}
625
626void
628{
629 m_psion = psion;
630}
631
632void
634{
635 int n = file->m_header.m_nfiles;
636 int fileix = n - file->m_header.m_installationFiles;
637 if (logLevel >= 1)
638 fprintf(stderr, "Uninstalling %d files, from a total of %d.\n",
640 file->m_header.m_nfiles);
641 int lang = file->getLanguage();
642 while (fileix < n)
643 {
644 SISFileRecord* fileRecord = &file->m_fileRecords[fileix];
645 m_fileNo = (fileRecord->m_flags & 1) ? lang : 0;
646 char drive = file->m_header.m_installationDrive;
647 fileRecord->setMainDrive(drive);
648 uninstallFile(fileRecord);
649 ++fileix;
650 }
651}
652
653void
655{
656 switch (fileRecord->m_fileType)
657 {
658 case 0:
659 case 4:
660 removeFile(fileRecord);
661 break;
662 case 2:
663 {
664#if 0
665 // This is messy... We can't remove the sis component unless
666 // we've stored the entire component in the residual sis
667 // file on the target machine.
668 if (logLevel >= 1)
669 fprintf(stderr, "Recursive sis file...\n");
670 SISFile sisFile;
671 int fileptr = fileRecord->m_filePtrs[m_fileNo];
672 uint8_t* buf2 = m_buf + fileptr;
673 off_t len = fileRecord->m_fileLengths[m_fileNo];
674 if (m_lastSisFile < fileptr + len)
675 m_lastSisFile = fileptr + len;
676 SisRC rc = sisFile.fillFrom(buf2, len);
677 if (rc != SIS_OK)
678 {
679 fprintf(stderr,
680 "Could not read contained sis file, rc = %d\n", rc);
681 break;
682 }
683 SISInstaller installer;
684 installer.setPsion(m_psion);
685 installer.setInstalled(m_installed);
686 rc = installer.run(&sisFile, buf2, len, m_file);
687 if (0 == m_drive)
688 {
691 if (logLevel >= 1)
692 fprintf(stderr,
693 "Updated drive to %c from recursive sis file\n",
694 m_drive);
695 }
696#endif
697 break;
698 }
699 }
700}
Wrapper class featuring range-checking and string representation of enumerated values.
Definition: Enum.h:136
A class, representing a directory entry of the Psion.
Definition: plpdirent.h:78
const char * getName()
Retrieve the file name of a directory entry.
Definition: plpdirent.cc:89
A class representing information about a Disk drive on the psion.
Definition: plpdirent.h:196
uint64_t getSize()
Retrieve the total capacity of the drive.
Definition: plpdirent.cc:244
uint32_t getMediaType()
Retrieve the media type of the drive.
Definition: plpdirent.cc:169
uint64_t getSpace()
Retrieve the free capacity on the drive.
Definition: plpdirent.cc:249
Semi smart proxy for communicating with a Psion.
Definition: psion.h:36
virtual Enum< rfsv::errs > dir(const char *dir, PlpDir &files)
Definition: psion.cpp:113
virtual Enum< rfsv::errs > devinfo(const char drive, PlpDrive &plpDrive)
Definition: psion.cpp:99
virtual Enum< rfsv::errs > devlist(uint32_t &devbits)
Definition: psion.cpp:105
virtual void remove(const char *name)
Definition: psion.cpp:149
virtual Enum< rfsv::errs > mkdir(const char *dir)
Definition: psion.cpp:143
virtual Enum< rfsv::errs > copyToPsion(const char *const from, const char *const to, void *, cpCallback_t func)
Definition: psion.cpp:89
virtual Enum< rfsv::errs > copyFromPsion(const char *const from, int fd, cpCallback_t func)
Definition: psion.cpp:82
uint32_t m_uid1
Definition: sisfileheader.h:82
uint16_t m_nlangs
Definition: sisfileheader.h:87
uint16_t m_major
Definition: sisfileheader.h:96
uint16_t m_nreqs
Definition: sisfileheader.h:89
uint16_t m_minor
Definition: sisfileheader.h:97
uint16_t m_installationFiles
Definition: sisfileheader.h:91
uint16_t m_nfiles
Definition: sisfileheader.h:88
uint32_t m_installationDrive
Definition: sisfileheader.h:92
Information about a file component in a SIS file.
Definition: sisfilerecord.h:34
uint8_t * getFilePtr(int fileNo)
Return a pointer to the file data for the file for the specified language.
uint32_t m_flags
1 if multiple language versions, otherwise 0.
Definition: sisfilerecord.h:64
uint32_t m_fileDetails
If file type is 1:
Definition: sisfilerecord.h:91
uint32_t m_destLength
Definition: sisfilerecord.h:95
uint32_t m_fileType
Type of file.
Definition: sisfilerecord.h:76
void setMainDrive(char drive)
uint8_t * getDestPtr()
Definition: sisfilerecord.h:48
uint32_t * m_filePtrs
uint32_t * m_fileLengths
Definition: sisfilerecord.h:96
The top level container of a SIS file.
Definition: sisfile.h:36
void setDrive(char drive)
Set the installed drive.
Definition: sisfile.cpp:155
SisRC fillFrom(uint8_t *buf, off_t len)
Populate the fields.
Definition: sisfile.cpp:48
SISReqRecord * m_reqRecords
Definition: sisfile.h:111
void setFiles(int nFiles)
Set the number of installed files.
Definition: sisfile.cpp:161
SisRC compareApp(SISFile *other)
Compare uid and version number of this file, with another.
Definition: sisfile.cpp:42
SISFileRecord * m_fileRecords
Definition: sisfile.h:110
void ownBuffer()
Definition: sisfile.h:83
SISFileHeader m_header
Definition: sisfile.h:108
void setLanguage(int lang)
Set the selected installation language.
Definition: sisfile.cpp:167
int getLanguage()
Return the currently selected installation language.
Definition: sisfile.cpp:137
uint32_t getResidualEnd()
Get the number of bytes that should be copied to the residual sis file on the psion.
Definition: sisfile.h:78
uint8_t * getName()
Get the name of this component, in the selected language.
Definition: sisfile.cpp:149
A minimal SIS installer.
Definition: sisinstaller.h:38
void selectDrive()
Ask the user which drive to install to.
void loadPsionSis(const char *name)
SISFileLink * m_installed
Definition: sisinstaller.h:81
void removeFile(SISFileRecord *fileRecord)
virtual ~SISInstaller()
void copyBuf(const uint8_t *buf, int len, char *name)
Store the contents of a buffer in a file on the Psion.
bool m_ownInstalled
Definition: sisinstaller.h:85
void setPsion(Psion *psion)
Set the Psion manager.
SISFile * m_file
Definition: sisinstaller.h:79
Psion * m_psion
Definition: sisinstaller.h:75
void uninstallFile(SISFileRecord *fileRecord)
int installFile(SISFileRecord *fileRecord)
void createDirs(char *filename)
SisRC run(SISFile *file, uint8_t *buf, off_t len)
void copyFile(SISFileRecord *fileRecord)
Copy a file to the Psion.
void uninstall(SISFile *sisFile)
uint8_t * m_buf
Definition: sisinstaller.h:77
SisRC loadInstalled()
void setInstalled(SISFileLink *installed)
Set the base pointer to the list of already installed applications, so we don't have to scan it for e...
Definition: sisinstaller.h:59
Information about an application that must be installed prior to the current one.
Definition: sisreqrecord.h:32
uint32_t m_uid
Definition: sisreqrecord.h:46
uint16_t m_major
Definition: sisreqrecord.h:47
uint16_t m_minor
Definition: sisreqrecord.h:48
@ E_PSI_GEN_NONE
Definition: rfsv.h:110
@ E_PSI_FILE_EXIST
Definition: rfsv.h:134
static int checkAbortHash(void *, uint32_t)
Definition: ftp.cc:166
static int continueRunning
Definition: ftp.cc:83
#define _(String)
Definition: plpintl.h:35
std::deque< class PlpDirent > PlpDir
Definition: rfsv.h:31
static int checkAbortHash(void *, uint32_t)
#define SYSTEMINSTALL
static int continueRunning
int logLevel
Definition: sistypes.cpp:25
SisRC
Return Codes.
Definition: sistypes.h:29
@ SIS_OK
Definition: sistypes.h:30
@ SIS_ABORTED
Definition: sistypes.h:35
@ SIS_VER_EARLIER
Definition: sistypes.h:37
@ SIS_FAILED
Definition: sistypes.h:34
@ SIS_SAME_OR_LATER
Definition: sistypes.h:38
@ SIS_OTHER_VARIANT
Definition: sistypes.h:39