00001
00002
00003 #include "filecls.h"
00004
00005 int LFile::FileType()
00006 {
00007 char buf[3];
00008 if(Read(buf, 3)!=3) return false;
00009
00010 if(buf[0]=='B' && buf[1]=='Z' && buf[2]=='h') return FILE_BZ2;
00011 if(buf[0]=='\037' && buf[1]=='\213') return FILE_GZ;
00012 return FILE_UNKNOWN;
00013 }
00014
00015 static LFile *Unzip(const char *fname, const char *exec)
00016 {
00017 char cmd[1000];
00018 char tmp[]="/tmp/.TMPXXXXXX";
00019 LFile *fp;
00020
00021 fp=LFile::MakeTemp(tmp);
00022 if(fp==NULL) ERROR("Can't create tempfile");
00023 StrPrintf(cmd, "%s -cd \"%s\" > \"%s\"", exec, fname, tmp);
00024 system(cmd);
00025 fp->Stat();
00026 LFile::Unlink(tmp);
00027 return fp;
00028 }
00029
00030 void LFile::BZipFile(const char *fname, bool bg)
00031 {
00032 char buffer[1000]="bzip2 -9 -f \"";
00033
00034 StrCat(buffer, fname);
00035 StrCat(buffer, "\"");
00036 if(bg) StrCat(buffer, " &");
00037 INFO(buffer);
00038 system(buffer);
00039 }
00040
00041 void LFile::GZipFile(const char *fname, bool bg)
00042 {
00043 char buffer[1000]="gzip -9 -f \"";
00044
00045 StrCat(buffer, fname);
00046 StrCat(buffer, "\"");
00047 if(bg) StrCat(buffer, " &");
00048 INFO(buffer);
00049 system(buffer);
00050 }
00051
00052 int LFile::LoadToString(const char *fname, char *&buffer, int size)
00053 {
00054 int s, ret;
00055 LFile *file, *f2;
00056 file=Open(fname, LFile::O_Read);
00057 if(file==NULL) {
00058 SYSERROR("LoadConfig: Can not open "YEL<<fname<<NOR);
00059 return 0;
00060 }
00061 switch(file->FileType())
00062 {
00063 case FILE_BZ2:
00064 f2=Unzip(fname, "bzip2");
00065 goto l_unzipped;
00066 case FILE_GZ:
00067 f2=Unzip(fname, "gzip");
00068 l_unzipped:
00069 if(f2==NULL) return 0;
00070 Close(file);
00071 file=f2;
00072
00073 case FILE_UNKNOWN:
00074 break;
00075 default: NOTREACHED();
00076 }
00077
00078 if(size==0) {
00079 s=(int)file->Length();
00080 buffer=(char *)MAlloc(s+1);
00081 if(buffer==NULL) {
00082 ERROR("LoadFileToString: Out of memory.");
00083 return 0;
00084 }
00085 }
00086 else s=size;
00087 file->SeekFromBegin(0);
00088 ret=file->Read(buffer, s);
00089 Close(file);
00090 if(ret!=s) {
00091 ERROR("LoadFileToString: File size changed!");
00092 s=ret;
00093 }
00094 buffer[s]=0;
00095 return s;
00096 }
00097
00098 void LFile::SubHomeDir(const char *fname, char *extname)
00099 {
00100 char Home[400], *ph, *pt;
00101
00102 ph=getenv("HOME");
00103 pt=strchr(fname, '~');
00104
00105 if((pt==NULL)||(ph==NULL))
00106 {
00107 if(fname!=extname) strcpy(extname,fname);
00108
00109 return;
00110 }
00111 *pt=0;
00112 strcpy(Home,fname);
00113 strcpy(Home+strlen(Home),ph);
00114 strcpy(Home+strlen(Home),pt+1);
00115 strcpy(extname,Home);
00116 if(fname!=extname) *pt='~';
00117 INFO_Printf("replace %s by %s\n",fname,extname);
00118 }
00119
00120 #ifdef _ZIPCAT_TEST
00121 int main(int argc, char *argv[])
00122 {
00123 char *buffer;
00124 int nb;
00125 if(argc==1) _Error<< "Usage: zipcat [file] ...\n"
00126 "dump contents of bzip2 or gzip compressed file.\n";
00127 for(int i=1;i<argc;i++) {
00128 nb=LFile::LoadToString(argv[i], buffer, 0);
00129 _IO << buffer;
00130 Free(buffer);
00131 }
00132 }
00133
00134 #endif //_ZIPCAT_TEST
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178