20static char *unpackSuffix[UNPACK_TYPES] = {
25static char *unpackCommand[UNPACK_TYPES] = {
26 "gzip -dcn %s 2> /dev/null ",
43long PackSuffixType(
char *filename,
char **unpackedName,
unsigned long mode) {
44 char *extension, buffer[10];
48 if (!(extension = strrchr(filename,
'.')))
52 for (i = 0; i < UNPACK_TYPES; i++)
53 if (strcmp(extension, unpackSuffix[i]) == 0) {
55 cp_str(unpackedName, filename);
56 extension = strrchr(*unpackedName,
'.');
61 if (i == UNPACK_TYPES)
64 if (mode & UNPACK_REQUIRE_SDDS) {
65 if (!(fp = fopen(filename, FOPEN_READ_MODE)))
67 if (fread(buffer,
sizeof(*buffer), 4, fp) == 4 && strncmp(buffer,
"SDDS", 4) == 0) {
89FILE *
UnpackFopen(
char *filename,
unsigned long mode,
short *popenUsed,
char **tmpFileUsed) {
90 static char *command = NULL;
101 return fopen(filename, FOPEN_READ_MODE);
103 if (!(command =
trealloc(command,
sizeof(*command) * (strlen(filename) + 100))))
105 if (mode & UNPACK_USE_PIPE) {
106 sprintf(command, unpackCommand[type], filename);
110 fprintf(stderr,
"popen is not supported in vxWorks\n");
114 return popen(command, FOPEN_READ_MODE);
117 sprintf(command, unpackCommand[type], filename);
119 strcat(command,
"> /tmp/");
120 strcat(command, tmpName);
123 sprintf(command,
"/tmp/%s", tmpName);
125 cp_str(tmpFileUsed, command);
127 return fopen(command, FOPEN_READ_MODE);
89FILE *
UnpackFopen(
char *filename,
unsigned long mode,
short *popenUsed,
char **tmpFileUsed) {
…}
void * trealloc(void *old_ptr, uint64_t size_of_block)
Reallocates a memory block to a new size.
char * cp_str(char **s, char *t)
Copies a string, allocating memory for storage.
char * tmpname(char *s)
Supplies a unique temporary filename.
FILE * UnpackFopen(char *filename, unsigned long mode, short *popenUsed, char **tmpFileUsed)
Opens a file, potentially unpacking it based on its extension and mode.
long PackSuffixType(char *filename, char **unpackedName, unsigned long mode)
Determines the unpacking type based on the file extension.