summaryrefslogtreecommitdiff
authorandyq <andyq>2002-10-16 23:08:08 (UTC)
committer andyq <andyq>2002-10-16 23:08:08 (UTC)
commit593fe744126a398e2714070137b6f19e398d2c9d (patch) (unidiff)
tree3cf11467787c4f8860bc8f5f87ceaab87ea8b2f4
parent196a3f566bdc5bd6188f2265e05adbdb519a6e09 (diff)
downloadopie-593fe744126a398e2714070137b6f19e398d2c9d.zip
opie-593fe744126a398e2714070137b6f19e398d2c9d.tar.gz
opie-593fe744126a398e2714070137b6f19e398d2c9d.tar.bz2
Fixed bug with linking files
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/aqpkg/ipkg.cpp16
1 files changed, 14 insertions, 2 deletions
diff --git a/noncore/settings/aqpkg/ipkg.cpp b/noncore/settings/aqpkg/ipkg.cpp
index f8513e4..6d0edad 100644
--- a/noncore/settings/aqpkg/ipkg.cpp
+++ b/noncore/settings/aqpkg/ipkg.cpp
@@ -52,155 +52,158 @@ Ipkg :: ~Ipkg()
52// dir is the directory to run ipkg in (defaults to "") 52// dir is the directory to run ipkg in (defaults to "")
53bool Ipkg :: runIpkg( ) 53bool Ipkg :: runIpkg( )
54{ 54{
55 bool ret = false; 55 bool ret = false;
56 56
57 QDir::setCurrent( "/tmp" ); 57 QDir::setCurrent( "/tmp" );
58 QString cmd = ""; 58 QString cmd = "";
59 59
60 if ( runtimeDir != "" ) 60 if ( runtimeDir != "" )
61 { 61 {
62 cmd += "cd "; 62 cmd += "cd ";
63 cmd += runtimeDir; 63 cmd += runtimeDir;
64 cmd += " ; "; 64 cmd += " ; ";
65 } 65 }
66 cmd += "ipkg"; 66 cmd += "ipkg";
67 67
68 if ( option != "update" && option != "download" && option != "upgrade" ) 68 if ( option != "update" && option != "download" && option != "upgrade" )
69 { 69 {
70 cmd += " -dest "+ destination; 70 cmd += " -dest "+ destination;
71 cmd += " -force-defaults"; 71 cmd += " -force-defaults";
72 72
73 if ( flags & FORCE_DEPENDS ) 73 if ( flags & FORCE_DEPENDS )
74 cmd += " -force-depends"; 74 cmd += " -force-depends";
75 if ( flags & FORCE_REINSTALL ) 75 if ( flags & FORCE_REINSTALL )
76 cmd += " -force-reinstall"; 76 cmd += " -force-reinstall";
77 if ( flags & FORCE_REMOVE ) 77 if ( flags & FORCE_REMOVE )
78 cmd += " -force-removal-of-essential-packages"; 78 cmd += " -force-removal-of-essential-packages";
79 if ( flags & FORCE_OVERWRITE ) 79 if ( flags & FORCE_OVERWRITE )
80 cmd += " -force-overwrite"; 80 cmd += " -force-overwrite";
81 81
82 // Handle make links 82 // Handle make links
83 // Rules - If make links is switched on, create links to root 83 // Rules - If make links is switched on, create links to root
84 // if destDir is NOT / 84 // if destDir is NOT /
85 if ( flags & MAKE_LINKS ) 85 if ( flags & MAKE_LINKS )
86 { 86 {
87 // If destDir == / turn off make links as package is being insalled 87 // If destDir == / turn off make links as package is being insalled
88 // to root already. 88 // to root already.
89 if ( destDir == "/" ) 89 if ( destDir == "/" )
90 flags ^= MAKE_LINKS; 90 flags ^= MAKE_LINKS;
91 } 91 }
92 92
93 } 93 }
94 94
95#ifdef X86 95#ifdef X86
96 cmd += " -f "; 96 cmd += " -f ";
97 cmd += IPKG_CONF; 97 cmd += IPKG_CONF;
98#endif 98#endif
99 99
100 cmd += " " + option; 100 cmd += " " + option;
101 if ( option != "upgrade" ) 101 if ( option != "upgrade" )
102 cmd += " " + package; 102 cmd += " " + package;
103 cmd += " 2>&1"; 103 cmd += " 2>&1";
104 104
105 qApp->processEvents(); 105 qApp->processEvents();
106 106
107 // If we are removing packages and make links option is selected 107 // If we are removing packages and make links option is selected
108 // create the links 108 // create the links
109 if ( option == "remove" ) 109 if ( option == "remove" )
110 { 110 {
111 createLinks = false; 111 createLinks = false;
112 if ( flags & MAKE_LINKS ) 112 if ( flags & MAKE_LINKS )
113 { 113 {
114 emit outputText( QString( "Removing symbolic links...\n" ) ); 114 emit outputText( QString( "Removing symbolic links...\n" ) );
115 linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir ); 115 linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir );
116 emit outputText( QString( " " ) );
116 } 117 }
117 } 118 }
118 119
119 emit outputText( cmd ); 120 emit outputText( cmd );
120 121
121 // Execute command 122 // Execute command
122 dependantPackages = new QList<QString>; 123 dependantPackages = new QList<QString>;
123 dependantPackages->setAutoDelete( true ); 124 dependantPackages->setAutoDelete( true );
124 125
125 ret = executeIpkgCommand( cmd, option ); 126 ret = executeIpkgCommand( cmd, option );
126 127
127 if ( option == "install" ) 128 if ( option == "install" )
128 { 129 {
129 // If we are not removing packages and make links option is selected 130 // If we are not removing packages and make links option is selected
130 // create the links 131 // create the links
131 createLinks = true; 132 createLinks = true;
132 if ( flags & MAKE_LINKS ) 133 if ( flags & MAKE_LINKS )
133 { 134 {
134 emit outputText( " " ); 135 emit outputText( " " );
135 emit outputText( QString( "Creating symbolic links for " )+ package ); 136 emit outputText( QString( "Creating symbolic links for " )+ package );
136 137
137 linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir ); 138 linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir );
138 139
139 // link dependant packages that were installed with this release 140 // link dependant packages that were installed with this release
140 QString *pkg; 141 QString *pkg;
141 for ( pkg = dependantPackages->first(); pkg != 0; pkg = dependantPackages->next() ) 142 for ( pkg = dependantPackages->first(); pkg != 0; pkg = dependantPackages->next() )
142 { 143 {
144 if ( *pkg == package )
145 continue;
143 emit outputText( " " ); 146 emit outputText( " " );
144 emit outputText( QString( "Creating symbolic links for " )+ (*pkg) ); 147 emit outputText( QString( "Creating symbolic links for " )+ (*pkg) );
145 linkPackage( Utils::getPackageNameFromIpkFilename( *pkg ), destination, destDir ); 148 linkPackage( Utils::getPackageNameFromIpkFilename( *pkg ), destination, destDir );
146 } 149 }
147 } 150 }
148 } 151 }
149 152
150 delete dependantPackages; 153 delete dependantPackages;
151 154
152 emit outputText( QString( "Finished - status=" ) + (ret ? "success" : "failure") ); 155 emit outputText( QString( "Finished - status=" ) + (ret ? "success" : "failure") );
153 return ret; 156 return ret;
154} 157}
155 158
156 159
157int Ipkg :: executeIpkgCommand( QString &cmd, const QString option ) 160int Ipkg :: executeIpkgCommand( QString &cmd, const QString option )
158{ 161{
159 FILE *fp = NULL; 162 FILE *fp = NULL;
160 char line[130]; 163 char line[130];
161 QString lineStr, lineStrOld; 164 QString lineStr, lineStrOld;
162 int ret = false; 165 int ret = false;
163 166
164 fp = popen( (const char *) cmd, "r"); 167 fp = popen( (const char *) cmd, "r");
165 if ( fp == NULL ) 168 if ( fp == NULL )
166 { 169 {
167 cout << "Couldn't execute " << cmd << "! err = " << fp << endl; 170 cout << "Couldn't execute " << cmd << "! err = " << fp << endl;
168 QString text; 171 QString text;
169 text.sprintf( "Couldn't execute %s! See stdout for error code", (const char *)cmd ); 172 text.sprintf( "Couldn't execute %s! See stdout for error code", (const char *)cmd );
170 emit outputText( text ); 173 emit outputText( text );
171 } 174 }
172 else 175 else
173 { 176 {
174 while ( fgets( line, sizeof line, fp) != NULL ) 177 while ( fgets( line, sizeof line, fp) != NULL )
175 { 178 {
176 lineStr = line; 179 lineStr = line;
177 lineStr=lineStr.left( lineStr.length()-1 ); 180 lineStr=lineStr.left( lineStr.length()-1 );
178 181
179 if ( lineStr != lineStrOld ) 182 if ( lineStr != lineStrOld )
180 { 183 {
181 //See if we're finished 184 //See if we're finished
182 if ( option == "install" ) 185 if ( option == "install" )
183 { 186 {
184 // Need to keep track of any dependant packages that get installed 187 // Need to keep track of any dependant packages that get installed
185 // so that we can create links to them as necessary 188 // so that we can create links to them as necessary
186 if ( lineStr.startsWith( "Installing " ) ) 189 if ( lineStr.startsWith( "Installing " ) )
187 { 190 {
188 cout << "LineStr = " << lineStr << endl; 191 cout << "LineStr = " << lineStr << endl;
189 int start = lineStr.find( " " ) + 1; 192 int start = lineStr.find( " " ) + 1;
190 int end = lineStr.find( " ", start ); 193 int end = lineStr.find( " ", start );
191 QString *package = new QString( lineStr.mid( start, end-start ) ); 194 QString *package = new QString( lineStr.mid( start, end-start ) );
192 dependantPackages->append( package ); 195 dependantPackages->append( package );
193 cout << "installing dependant package <" << *package << ">" << endl; 196 cout << "installing dependant package <" << *package << ">" << endl;
194 } 197 }
195 } 198 }
196 199
197 if ( option == "update" ) 200 if ( option == "update" )
198 { 201 {
199 if (lineStr.contains("Updated list")) 202 if (lineStr.contains("Updated list"))
200 ret = true; 203 ret = true;
201 } 204 }
202 else if ( option == "download" ) 205 else if ( option == "download" )
203 { 206 {
204 if (lineStr.contains("Downloaded")) 207 if (lineStr.contains("Downloaded"))
205 ret = true; 208 ret = true;
206 } 209 }
@@ -223,127 +226,136 @@ int Ipkg :: executeIpkgCommand( QString &cmd, const QString option )
223 226
224 227
225void Ipkg :: linkPackage( const QString &packFileName, const QString &dest, const QString &destDir ) 228void Ipkg :: linkPackage( const QString &packFileName, const QString &dest, const QString &destDir )
226{ 229{
227 if ( dest == "root" || dest == "/" ) 230 if ( dest == "root" || dest == "/" )
228 return; 231 return;
229 232
230 qApp->processEvents(); 233 qApp->processEvents();
231 QStringList *fileList = getList( packFileName, destDir ); 234 QStringList *fileList = getList( packFileName, destDir );
232 qApp->processEvents(); 235 qApp->processEvents();
233 processFileList( fileList, destDir ); 236 processFileList( fileList, destDir );
234 delete fileList; 237 delete fileList;
235} 238}
236 239
237QStringList* Ipkg :: getList( const QString &packageFilename, const QString &destDir ) 240QStringList* Ipkg :: getList( const QString &packageFilename, const QString &destDir )
238{ 241{
239 QString packageFileDir = destDir+"/usr/lib/ipkg/info/"+packageFilename+".list"; 242 QString packageFileDir = destDir+"/usr/lib/ipkg/info/"+packageFilename+".list";
240 QFile f( packageFileDir ); 243 QFile f( packageFileDir );
241 244
242 cout << "Try to open " << packageFileDir.latin1() << endl; 245 cout << "Try to open " << packageFileDir.latin1() << endl;
243 if ( !f.open(IO_ReadOnly) ) 246 if ( !f.open(IO_ReadOnly) )
244 { 247 {
245 // Couldn't open from dest, try from / 248 // Couldn't open from dest, try from /
246// cout << "Could not open:" << packageFileDir << endl; 249// cout << "Could not open:" << packageFileDir << endl;
247 f.close(); 250 f.close();
248 251
249 packageFileDir = "/usr/lib/ipkg/info/"+packageFilename+".list"; 252 packageFileDir = "/usr/lib/ipkg/info/"+packageFilename+".list";
250 f.setName( packageFileDir ); 253 f.setName( packageFileDir );
251// cout << "Try to open " << packageFileDir.latin1() << endl; 254// cout << "Try to open " << packageFileDir.latin1() << endl;
252 if ( ! f.open(IO_ReadOnly) ) 255 if ( ! f.open(IO_ReadOnly) )
253 { 256 {
254 cout << "Could not open:" << packageFileDir << endl; 257 cout << "Could not open:" << packageFileDir << endl;
255 emit outputText( QString( "Could not open :" ) + packageFileDir ); 258 emit outputText( QString( "Could not open :" ) + packageFileDir );
256 return (QStringList*)0; 259 return (QStringList*)0;
257 } 260 }
258 } 261 }
259 QStringList *fileList = new QStringList(); 262 QStringList *fileList = new QStringList();
260 QTextStream t( &f ); 263 QTextStream t( &f );
261 while ( !t.eof() ) 264 while ( !t.eof() )
262 *fileList += t.readLine(); 265 *fileList += t.readLine();
263 266
264 f.close(); 267 f.close();
265 return fileList; 268 return fileList;
266} 269}
267 270
268void Ipkg :: processFileList( const QStringList *fileList, const QString &destDir ) 271void Ipkg :: processFileList( const QStringList *fileList, const QString &destDir )
269{ 272{
270 if ( !fileList || fileList->isEmpty() ) 273 if ( !fileList || fileList->isEmpty() )
271 return; 274 return;
272 275
273 QString baseDir = ROOT; 276 QString baseDir = ROOT;
274 277
275 if ( createLinks == true ) 278 if ( createLinks == true )
276 { 279 {
277 for ( uint i=0; i < fileList->count(); i++ ) 280 for ( uint i=0; i < fileList->count(); i++ )
278 { 281 {
279 processLinkDir( (*fileList)[i], baseDir, destDir ); 282 processLinkDir( (*fileList)[i], baseDir, destDir );
280 qApp->processEvents(); 283 qApp->processEvents();
281 } 284 }
282 } 285 }
283 else 286 else
284 { 287 {
285 for ( int i = fileList->count()-1; i >= 0 ; i-- ) 288 for ( int i = fileList->count()-1; i >= 0 ; i-- )
286 { 289 {
287 cout << "i = " << i << ", Dealing with " << (*fileList)[i] << endl;
288 processLinkDir( (*fileList)[i], baseDir, destDir ); 290 processLinkDir( (*fileList)[i], baseDir, destDir );
289 qApp->processEvents(); 291 qApp->processEvents();
290 } 292 }
291 } 293 }
292} 294}
293 295
294void Ipkg :: processLinkDir( const QString &file, const QString &destDir, const QString &baseDir ) 296void Ipkg :: processLinkDir( const QString &file, const QString &destDir, const QString &baseDir )
295{ 297{
298
296 QString sourceFile = baseDir + file; 299 QString sourceFile = baseDir + file;
297 QString linkFile = destDir + file; 300
301 QString linkFile = destDir;
302 if ( file.startsWith( "/" ) && destDir.right( 1 ) == "/" )
303 {
304 linkFile += file.mid( 1 );
305 }
306 else
307 {
308 linkFile += file;
309 }
298 QString text; 310 QString text;
299 if ( createLinks ) 311 if ( createLinks )
300 { 312 {
301 // If this file is a directory (ends with a /) and it doesn't exist, 313 // If this file is a directory (ends with a /) and it doesn't exist,
302 // we need to create it 314 // we need to create it
303 if ( file.right(1) == "/" ) 315 if ( file.right(1) == "/" )
304 { 316 {
305 QFileInfo f( linkFile ); 317 QFileInfo f( linkFile );
306 if ( !f.exists() ) 318 if ( !f.exists() )
307 { 319 {
308 emit outputText( QString( "Creating directory " ) + linkFile ); 320 emit outputText( QString( "Creating directory " ) + linkFile );
309 QDir d; 321 QDir d;
310 d.mkdir( linkFile, true ); 322 d.mkdir( linkFile, true );
311 } 323 }
312 else 324 else
313 emit outputText( QString( "Directory " ) + linkFile + " exists" ); 325 emit outputText( QString( "Directory " ) + linkFile + " exists" );
314 326
315 } 327 }
316 else 328 else
317 { 329 {
318 int rc = symlink( sourceFile, linkFile ); 330 int rc = symlink( sourceFile, linkFile );
319 text = (rc == 0 ? "Linked " : "Failed to link "); 331 text = (rc == 0 ? "Linked " : "Failed to link ");
320 text += sourceFile + " to " + linkFile; 332 text += sourceFile + " to " + linkFile;
321 emit outputText( text ); 333 emit outputText( text );
322 } 334 }
323 } 335 }
324 else 336 else
325 { 337 {
326 QFileInfo f( linkFile ); 338 QFileInfo f( linkFile );
327 if ( f.exists() ) 339 if ( f.exists() )
328 { 340 {
329 if ( f.isFile() ) 341 if ( f.isFile() )
330 { 342 {
331 QFile f( linkFile ); 343 QFile f( linkFile );
332 bool rc = f.remove(); 344 bool rc = f.remove();
333 345
334 text = (rc ? "Removed " : "Failed to remove "); 346 text = (rc ? "Removed " : "Failed to remove ");
335 text += linkFile; 347 text += linkFile;
336 emit outputText( text ); 348 emit outputText( text );
337 } 349 }
338 else if ( f.isDir() ) 350 else if ( f.isDir() )
339 { 351 {
340 QDir d; 352 QDir d;
341 bool rc = d.rmdir( linkFile, true ); 353 bool rc = d.rmdir( linkFile, true );
342 text = (rc ? "Removed " : "Failed to remove "); 354 text = (rc ? "Removed " : "Failed to remove ");
343 text += linkFile; 355 text += linkFile;
344 emit outputText( text ); 356 emit outputText( text );
345 } 357 }
346 } 358 }
347 } 359 }
348 360
349} 361}