FOSSology  4.6.0
Open Source License Compliance by Open Source Software
ununpack.h
1 /*
2  Ununpack: The universal unpacker.
3 
4  SPDX-FileCopyrightText: © 2007-2011 Hewlett-Packard Development Company, L.P.
5 
6  SPDX-License-Identifier: GPL-2.0-only
7 
8  This time, it's rewritten in C for speed and multithreading.
9 */
10 #ifndef UNUNPACK_H
11 #define UNUNPACK_H
12 
13 
14 #include <ctype.h>
15 #include <dirent.h>
16 #include <errno.h>
17 #include <fcntl.h>
18 #include <magic.h>
19 #include <signal.h>
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <time.h>
24 #include <unistd.h>
25 #include <libgen.h>
26 
27 #include <sys/mman.h>
28 #include <sys/stat.h>
29 #include <sys/time.h>
30 //#include <sys/timeb.h>
31 #include <sys/types.h>
32 #include <sys/wait.h>
33 
34 #include "checksum.h"
35 #include "ununpack-ar.h"
36 #include "ununpack-disk.h"
37 #include "ununpack-lzip.h"
38 #include "ununpack-iso.h"
39 #include "ununpack-zstd.h"
40 
41 #ifdef STANDALONE
42 #include "standalone.h"
43 #else
44 #include "libfossology.h"
45 #endif
46 
47 #define Last(x) (x)[strlen(x)-1]
48 #define MAXCHILD 4096
49 #define MAXSQL 4096
50 #define PATH_MAX 4096
51 
55 enum cmdtype
56 {
57  CMD_NULL=0,
58  CMD_PACK,
59  CMD_RPM,
60  CMD_ARC,
61  CMD_AR,
62  CMD_PARTITION,
63  CMD_ISO,
64  CMD_DISK,
65  CMD_DEB,
66  CMD_ZSTD,
67  CMD_LZIP,
68  CMD_DEFAULT
69 };
70 
71 typedef enum cmdtype cmdtype;
77 struct ParentInfo
78 {
79  int Cmd;
80  time_t StartTime;
81  time_t EndTime;
84 };
85 typedef struct ParentInfo ParentInfo;
86 
91 {
92  int ChildPid;
93  char ChildRecurse[FILENAME_MAX+1];
96  int ChildEnd;
98  struct stat ChildStat;
100 };
101 typedef struct unpackqueue unpackqueue;
102 
106 struct dirlist
107 {
108  char *Name;
109  struct dirlist *Next;
110 };
111 typedef struct dirlist dirlist;
112 
118 {
119  char Source[FILENAME_MAX];
120  char Partdir[FILENAME_MAX];
121  char Partname[FILENAME_MAX];
122  char PartnameNew[FILENAME_MAX];
124  int HasChild;
125  int Pruned;
126  int Corrupt;
127  struct stat Stat;
129  int Artifact;
130  int IsDir;
133  long pfile_pk;
134  long ufile_mode;
135 };
136 typedef struct ContainerInfo ContainerInfo;
137 
144 struct cmdlist
145 {
146  char * Magic;
147  char * Cmd;
148  char * CmdPre;
149  char * CmdPost;
150  char * MetaCmd;
151  cmdtype Type;
152  int Status;
155  long DBindex;
156 };
157 typedef struct cmdlist cmdlist;
158 
159 /* utils.c */
160 int IsInflatedFile(char *FileName, int InflateSize);
161 int IsDebianSourceFile(char *Filename);
162 void SafeExit (int rc);
163 void RemovePostfix(char *Name);
164 void InitCmd ();
165 int TaintString (char *Dest, int DestLen, char *Src, int ProtectQuotes, char *Replace);
166 extern int Prune (char *Fname, struct stat Stat);
167 extern int MkDirs (char *Fname);
168 extern int MkDir (char *Fname);
169 extern int IsDir (char *Fname);
170 extern int RemoveDir (char *dirpath);
171 int IsFile (char *Fname, int Link);
172 int ReadLine (FILE *Fin, char *Line, int MaxLine);
173 int IsExe (char *Exe, int Quiet);
174 int CopyFile (char *Src, char *Dst);
175 int ParentWait();
176 void CheckCommands (int Show);
177 int RunCommand (char *Cmd, char *CmdPre, char *File, char *CmdPost, char *Out, char *Where);
178 int InitMagic();
179 int FindCmd (char *Filename);
180 void FreeDirList (dirlist *DL);
181 dirlist * MakeDirList (char *Fullname);
182 void SetDir (char *Dest, int DestLen, char *Smain, char *Sfile);
184 int DBInsertPfile (ContainerInfo *CI, char *Fuid);
185 int DBInsertUploadTree (ContainerInfo *CI, int Mask);
186 int AddToRepository (ContainerInfo *CI, char *Fuid, int Mask);
187 int DisplayContainerInfo (ContainerInfo *CI, int Cmd);
188 char *PathCheck(char *DirPath);
189 void Usage (char *Name, char *Version);
190 void deleteTmpFiles(char *dir);
191 void SQLNoticeProcessor(void *arg, const char *message);
192 int ShouldExclude(char *Filename, const char *ExcludePatterns);
193 
194 
195 /* traverse.c */
196 void TraverseStart (char *Filename, char *Label, char *NewDir, int Recurse, char *ExcludePatterns);
197 void TraverseChild (int Index, ContainerInfo *CI, char *NewDir);
198 int Traverse (char *Filename, char *Basename, char *Label, char *NewDir, int Recurse, ParentInfo *PI, char *ExcludePatterns);
199 
200 #endif
201 
int Quiet
Run in quiet mode?
char * TaintString(char *S)
Create a string with taint quoting.
Definition: finder.c:35
Usage()
Print Usage statement.
Definition: fo_dbcheck.php:63
The main FOSSology C library.
void CopyFile(char *Source, char *Type, char *Name)
Definition: repcopyin.c:39
int ReadLine(FILE *Fin, char *Line, int MaxLine)
Definition: repcopyin.c:64
Structure for storing information about a particular file.
Definition: ununpack.h:118
int IsCompressed
Definition: ununpack.h:131
long pfile_pk
Definition: ununpack.h:133
int TopContainer
Definition: ununpack.h:123
ParentInfo PI
Definition: ununpack.h:128
char Partname[FILENAME_MAX]
Definition: ununpack.h:121
long uploadtree_pk
Definition: ununpack.h:132
long ufile_mode
Definition: ununpack.h:134
struct stat Stat
Definition: ununpack.h:127
char PartnameNew[FILENAME_MAX]
Definition: ununpack.h:122
char Partdir[FILENAME_MAX]
Definition: ununpack.h:120
Definition: monk.h:61
time_t StartTime
Definition: ununpack.h:80
long uploadtree_pk
Definition: ununpack.h:83
int ChildRecurseArtifact
Definition: ununpack.h:82
time_t EndTime
Definition: ununpack.h:81
Command table's single row.
Definition: ununpack.h:145
cmdtype Type
Definition: ununpack.h:151
long DBindex
Definition: ununpack.h:155
int Status
Definition: ununpack.h:152
char * MetaCmd
Definition: ununpack.h:150
char * Cmd
Definition: ununpack.h:147
int ModeMaskReg
Definition: ununpack.h:154
char * CmdPost
Definition: ununpack.h:149
char * CmdPre
Definition: ununpack.h:148
int ModeMaskDir
Definition: ununpack.h:153
Directory linked list.
Definition: ununpack.h:107
struct dirlist * Next
Definition: ununpack.h:109
Queue for files to be unpacked.
Definition: ununpack.h:91
int ChildStatus
Definition: ununpack.h:94
ParentInfo PI
Definition: ununpack.h:99
struct stat ChildStat
Definition: ununpack.h:98
int ChildEnd
Definition: ununpack.h:96
char ChildRecurse[FILENAME_MAX+1]
Definition: ununpack.h:93
int ChildCorrupt
Definition: ununpack.h:95
int ChildHasChild
Definition: ununpack.h:97
static char * Dst
Destination location.
Definition: test_CopyFile.c:14
static char * Src
Souce location.
Definition: test_CopyFile.c:13
void TraverseStart(char *Filename, char *Label, char *NewDir, int Recurse, char *ExcludePatterns)
Find all files (assuming a directory) and process (unpack) all of them.
Definition: traverse.c:24
void TraverseChild(int Index, ContainerInfo *CI, char *NewDir)
Called by exec'd child to process.
Definition: traverse.c:96
int Traverse(char *Filename, char *Basename, char *Label, char *NewDir, int Recurse, ParentInfo *PI, char *ExcludePatterns)
Find all files, traverse all directories. This is a depth-first search, in inode order!
Definition: traverse.c:279
int RunCommand(char *Cmd, char *CmdPre, char *File, char *CmdPost, char *Out, char *Where)
Try a command and return command code.
Definition: utils.c:623
int DisplayContainerInfo(ContainerInfo *CI, int Cmd)
Print what can be printed in XML.
Definition: utils.c:1459
void DebugContainerInfo(ContainerInfo *CI)
Print a ContainerInfo structure.
Definition: utils.c:1087
int RemoveDir(char *dirpath)
Remove all files under dirpath (rm -rf)
Definition: utils.c:1643
int MkDirs(char *Fname)
Same as command-line "mkdir -p".
Definition: utils.c:249
int Prune(char *Fname, struct stat Stat)
Given a filename and its stat, prune it.
Definition: utils.c:218
int InitMagic()
Open and load Magic file Initializes global MagicCookie.
Definition: utils.c:717
void CheckCommands(int Show)
Make sure all commands are usable.
Definition: utils.c:568
int IsDebianSourceFile(char *Filename)
Read file to see if it is a Debian source file.
Definition: utils.c:735
int MkDir(char *Fname)
Smart mkdir.
Definition: utils.c:304
void SetDir(char *Dest, int DestLen, char *Smain, char *Sfile)
Set a destination directory name.
Definition: utils.c:1049
int ParentWait()
Wait for a child. Sets child status.
Definition: utils.c:510
void RemovePostfix(char *Name)
get rid of the postfix
Definition: utils.c:91
int AddToRepository(ContainerInfo *CI, char *Fuid, int Mask)
Add a ContainerInfo record to the repository AND to the database.
Definition: utils.c:1404
void FreeDirList(dirlist *DL)
Free a list of files in a directory list.
Definition: utils.c:953
int DBInsertPfile(ContainerInfo *CI, char *Fuid)
Insert a Pfile record. Sets the pfile_pk in CI.
Definition: utils.c:1116
int DBInsertUploadTree(ContainerInfo *CI, int Mask)
Insert an UploadTree record.
Definition: utils.c:1288
void InitCmd()
Initialize the metahandler CMD table.
Definition: utils.c:109
int IsExe(char *Exe, int Quiet)
Check if the executable exists.
Definition: utils.c:394
void SafeExit(int rc)
Close scheduler and database connections, then exit.
Definition: utils.c:78
int FindCmd(char *Filename)
Given a file name, determine the type of extraction command. This uses Magic.
Definition: utils.c:852
int ShouldExclude(char *Filename, const char *ExcludePatterns)
Determines if a file or folder should be excluded.
Definition: utils.c:1789
int IsInflatedFile(char *FileName, int InflateSize)
Test if the file is a compression bomb.
Definition: utils.c:41
char * PathCheck(char *DirPath)
Check if path contains a "%U" or "%H". If so, substitute a unique ID for U.
Definition: utils.c:1664
void SQLNoticeProcessor(void *arg, const char *message)
Dummy postgresql notice processor. This prevents Notices from being written to stderr.
Definition: utils.c:1774
dirlist * MakeDirList(char *Fullname)
Create a list of files in a directory.
Definition: utils.c:972
int IsDir(char *Fname)
Given a filename, is it a directory?
Definition: utils.c:320
int Recurse
Level of unpack recursion. Default to infinite.
Definition: run_tests.c:19
char * NewDir
Test result directory.
Definition: run_tests.c:18
char * Filename
Filename.
Definition: run_tests.c:17
int IsFile(long mode)
Check if the pfile_id is a file.
Definition: wc_agent.c:55