author | andyq <andyq> | 2002-10-16 23:08:08 (UTC) |
---|---|---|
committer | andyq <andyq> | 2002-10-16 23:08:08 (UTC) |
commit | 593fe744126a398e2714070137b6f19e398d2c9d (patch) (unidiff) | |
tree | 3cf11467787c4f8860bc8f5f87ceaab87ea8b2f4 | |
parent | 196a3f566bdc5bd6188f2265e05adbdb519a6e09 (diff) | |
download | opie-593fe744126a398e2714070137b6f19e398d2c9d.zip opie-593fe744126a398e2714070137b6f19e398d2c9d.tar.gz opie-593fe744126a398e2714070137b6f19e398d2c9d.tar.bz2 |
Fixed bug with linking files
-rw-r--r-- | noncore/settings/aqpkg/ipkg.cpp | 16 |
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 "") |
53 | bool Ipkg :: runIpkg( ) | 53 | bool 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 | ||
157 | int Ipkg :: executeIpkgCommand( QString &cmd, const QString option ) | 160 | int 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 | ||
225 | void Ipkg :: linkPackage( const QString &packFileName, const QString &dest, const QString &destDir ) | 228 | void 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 | ||
237 | QStringList* Ipkg :: getList( const QString &packageFilename, const QString &destDir ) | 240 | QStringList* 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 | ||
268 | void Ipkg :: processFileList( const QStringList *fileList, const QString &destDir ) | 271 | void 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 | ||
294 | void Ipkg :: processLinkDir( const QString &file, const QString &destDir, const QString &baseDir ) | 296 | void 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 | } |