summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/opie-login/passworddialogimpl.cpp6
-rw-r--r--noncore/settings/aqpkg/ipkg.cpp11
2 files changed, 14 insertions, 3 deletions
diff --git a/core/opie-login/passworddialogimpl.cpp b/core/opie-login/passworddialogimpl.cpp
index d9132e2..3c1b474 100644
--- a/core/opie-login/passworddialogimpl.cpp
+++ b/core/opie-login/passworddialogimpl.cpp
@@ -1,237 +1,241 @@
1/* 1/*
2               =. This file is part of the OPIE Project 2               =. This file is part of the OPIE Project
3             .=l. Copyright (c) 2004 Holger Hans Peter Freyther <zecke@handhelds.org> 3             .=l. Copyright (c) 2004 Holger Hans Peter Freyther <zecke@handhelds.org>
4           .>+-= 4           .>+-=
5 _;:,     .>    :=|. This file is free software; you can 5 _;:,     .>    :=|. This file is free software; you can
6.> <`_,   >  .   <= redistribute it and/or modify it under 6.> <`_,   >  .   <= redistribute it and/or modify it under
7:`=1 )Y*s>-.--   : the terms of the GNU General Public 7:`=1 )Y*s>-.--   : the terms of the GNU General Public
8.="- .-=="i,     .._ License as published by the Free Software 8.="- .-=="i,     .._ License as published by the Free Software
9 - .   .-<_>     .<> Foundation; either version 2 of the License, 9 - .   .-<_>     .<> Foundation; either version 2 of the License,
10     ._= =}       : or (at your option) any later version. 10     ._= =}       : or (at your option) any later version.
11    .%`+i>       _;_. 11    .%`+i>       _;_.
12    .i_,=:_.      -<s. This file is distributed in the hope that 12    .i_,=:_.      -<s. This file is distributed in the hope that
13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
14    : ..    .:,     . . . without even the implied warranty of 14    : ..    .:,     . . . without even the implied warranty of
15    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 15    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
16  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU General 16  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU General
17..}^=.=       =       ; Public License for more details. 17..}^=.=       =       ; Public License for more details.
18++=   -.     .`     .: 18++=   -.     .`     .:
19 :     =  ...= . :.=- You should have received a copy of the GNU 19 :     =  ...= . :.=- You should have received a copy of the GNU
20 -.   .:....=;==+<; General Public License along with this file; 20 -.   .:....=;==+<; General Public License along with this file;
21  -_. . .   )=.  = see the file COPYING. If not, write to the 21  -_. . .   )=.  = see the file COPYING. If not, write to the
22    --        :-=` Free Software Foundation, Inc., 22    --        :-=` Free Software Foundation, Inc.,
23 59 Temple Place - Suite 330, 23 59 Temple Place - Suite 330,
24 Boston, MA 02111-1307, USA. 24 Boston, MA 02111-1307, USA.
25 25
26*/ 26*/
27 27
28#include <qlayout.h> 28#include <qlayout.h>
29#include <qlabel.h> 29#include <qlabel.h>
30#include <qlineedit.h> 30#include <qlineedit.h>
31#include <qvalidator.h> 31#include <qvalidator.h>
32#include <qmessagebox.h> 32#include <qmessagebox.h>
33#include <qhbox.h> 33#include <qhbox.h>
34#include <qtoolbutton.h> 34#include <qtoolbutton.h>
35 35
36 36
37 37
38#include <sys/types.h> 38#include <sys/types.h>
39#include <pwd.h> 39#include <pwd.h>
40#include <shadow.h> 40#include <shadow.h>
41#include <stdio.h> 41#include <stdio.h>
42#include <time.h> 42#include <time.h>
43#include <unistd.h> 43#include <unistd.h>
44 44
45// Shitty gcc2 toolchain 45// Shitty gcc2 toolchain
46extern "C" char* crypt( const char*, const char* ); 46extern "C" char* crypt( const char*, const char* );
47 47
48 48
49 49
50#include "passworddialogimpl.h" 50#include "passworddialogimpl.h"
51 51
52 52
53// This function is taken from 'busybox'. 53// This function is taken from 'busybox'.
54static int i64c(int i) { 54static int i64c(int i) {
55 if (i <= 0) 55 if (i <= 0)
56 return ('.'); 56 return ('.');
57 if (i == 1) 57 if (i == 1)
58 return ('/'); 58 return ('/');
59 if (i >= 2 && i < 12) 59 if (i >= 2 && i < 12)
60 return ('0' - 2 + i); 60 return ('0' - 2 + i);
61 if (i >= 12 && i < 38) 61 if (i >= 12 && i < 38)
62 return ('A' - 12 + i); 62 return ('A' - 12 + i);
63 if (i >= 38 && i < 63) 63 if (i >= 38 && i < 63)
64 return ('a' - 38 + i); 64 return ('a' - 38 + i);
65 return ('z'); 65 return ('z');
66} 66}
67 67
68// This function is taken from 'busybox'. 68// This function is taken from 'busybox'.
69static char *crypt_make_salt() { 69static char *crypt_make_salt() {
70 time_t now; 70 time_t now;
71 static unsigned long x; 71 static unsigned long x;
72 static char result[3]; 72 static char result[3];
73 73
74 ::time(&now); 74 ::time(&now);
75 x += now + getpid() + clock(); 75 x += now + getpid() + clock();
76 result[0] = i64c(((x >> 18) ^ (x >> 6)) & 077); 76 result[0] = i64c(((x >> 18) ^ (x >> 6)) & 077);
77 result[1] = i64c(((x >> 12) ^ x) & 077); 77 result[1] = i64c(((x >> 12) ^ x) & 077);
78 result[2] = '\0'; 78 result[2] = '\0';
79 return result; 79 return result;
80} 80}
81 81
82/* 82/*
83 * Modal dialog to force root password. It is quite hard as it only leave 83 * Modal dialog to force root password. It is quite hard as it only leave
84 * when a password is set. 84 * when a password is set.
85 * Also it prevalidates the password... 85 * Also it prevalidates the password...
86 */ 86 */
87PasswordDialogImpl::PasswordDialogImpl( QWidget* parent ) 87PasswordDialogImpl::PasswordDialogImpl( QWidget* parent )
88 : PasswordDialog( parent, 0, true ), m_isSet( PasswordDialogImpl::needDialog() ) { 88 : PasswordDialog( parent, 0, true ), m_isSet( PasswordDialogImpl::needDialog() ) {
89} 89}
90 90
91PasswordDialogImpl::~PasswordDialogImpl() { 91PasswordDialogImpl::~PasswordDialogImpl() {
92 /* qt does the stuff for us */ 92 /* qt does the stuff for us */
93} 93}
94 94
95void PasswordDialogImpl::done(int res) { 95void PasswordDialogImpl::done(int res) {
96 m_isSet = true; 96 m_isSet = true;
97 97
98 /* 98 /*
99 * The user hit 'Ok' see if we can safe the file 99 * The user hit 'Ok' see if we can safe the file
100 * if not an error will be raised and m_isSet altered. 100 * if not an error will be raised and m_isSet altered.
101 * On cancel we will see if it is now ok... 101 * On cancel we will see if it is now ok...
102 */ 102 */
103 if ( res == Accepted ) 103 if ( res == Accepted )
104 writePassword(); 104 writePassword();
105 else if(PasswordDialogImpl::needDialog() ) { 105 else if(PasswordDialogImpl::needDialog() ) {
106 switch( QMessageBox::warning(this,tr("Trying to leave without password set") , 106 switch( QMessageBox::warning(this,tr("Trying to leave without password set") ,
107 tr("<qt>No password was set. This could lead to you not beeing" 107 tr("<qt>No password was set. This could lead to you not beeing"
108 "able to remotely connect to your machine." 108 "able to remotely connect to your machine."
109 "Do you want to continue not setting a password?</qt>" ), 109 "Do you want to continue not setting a password?</qt>" ),
110 QMessageBox::Ok, QMessageBox::Cancel ) ) { 110 QMessageBox::Ok, QMessageBox::Cancel ) ) {
111 case QMessageBox::Cancel: 111 case QMessageBox::Cancel:
112 m_isSet = false; 112 m_isSet = false;
113 break; 113 break;
114 case QMessageBox::Ok: 114 case QMessageBox::Ok:
115 default: 115 default:
116 break; 116 break;
117 } 117 }
118 118
119 } 119 }
120 120
121 if(m_isSet) 121 if(m_isSet)
122 PasswordDialog::done( res ); 122 PasswordDialog::done( res );
123} 123}
124 124
125/* 125/*
126 * Lets see if we can write either shadow 126 * Lets see if we can write either shadow
127 * 127 *
128 */ 128 */
129/** 129/**
130 * CRYPT the password and then tries to write it either to the shadow password 130 * CRYPT the password and then tries to write it either to the shadow password
131 * or to the plain /etc/passwd 131 * or to the plain /etc/passwd
132 */ 132 */
133void PasswordDialogImpl::writePassword() { 133void PasswordDialogImpl::writePassword() {
134 /* 134 /*
135 * Check if both texts are the same 135 * Check if both texts are the same
136 */ 136 */
137 if ( m_pass->text() != m_confirm->text() ) 137 if ( m_pass->text() != m_confirm->text() )
138 return error( tr("Passwords don't match"), 138 return error( tr("Passwords don't match"),
139 tr("<qt>The two passwords don't match. Please try again.</qt>") ); 139 tr("<qt>The two passwords don't match. Please try again.</qt>") );
140 140
141 141
142 /* 142 /*
143 * Now crypt the password so we can write it later 143 * Now crypt the password so we can write it later
144 */ 144 */
145 char* password = ::crypt( m_pass->text().latin1(), crypt_make_salt() ); 145 char* password = ::crypt( m_pass->text().latin1(), crypt_make_salt() );
146 146
147 if ( !password ) 147 if ( !password )
148 return error( tr("Password not legal" ), 148 return error( tr("Password not legal" ),
149 tr("<qt>The entered password is not a valid password." 149 tr("<qt>The entered password is not a valid password."
150 "Please try entering a valid password.</qt>" ) ); 150 "Please try entering a valid password.</qt>" ) );
151 151
152 /* rewind and rewrite the password file */ 152 /* rewind and rewrite the password file */
153 ::setpwent(); 153 ::setpwent();
154 154
155 FILE* file = ::fopen( "/etc/passwd.new", "w" ); 155 FILE* file = ::fopen( "/etc/passwd.new", "w" );
156 struct passwd* pass; 156 struct passwd* pass;
157 while ( (pass = ::getpwent()) != 0l ) { 157 while ( (pass = ::getpwent()) != 0l ) {
158 /* no shadow password support */ 158 /* no shadow password support */
159 if ( pass->pw_uid == 0 ) 159 if ( pass->pw_uid == 0 )
160 pass->pw_passwd = password; 160 pass->pw_passwd = password;
161 161
162 ::putpwent( pass, file ); 162 ::putpwent( pass, file );
163 } 163 }
164 164
165 ::fclose( file ); 165 ::fclose( file );
166 ::endpwent(); 166 ::endpwent();
167 ::rename("/etc/passwd.new","/etc/passwd" ); 167 if (::rename("/etc/passwd.new","/etc/passwd" ) == -1)
168 return error( tr("Rename /etc/passwd failed"),
169 tr("<qt>Renaming /etc/passwd.new to /etc/passwd failed."
170 "Please check your /etc/passed file, your /etc directory "
171 "or your filesystem.</qt>") );
168 172
169 /* should be done now */ 173 /* should be done now */
170#ifdef OPIE_LOGIN_SHADOW_PW 174#ifdef OPIE_LOGIN_SHADOW_PW
171 #error "Can't write Shadow Passwords fixme" 175 #error "Can't write Shadow Passwords fixme"
172#endif 176#endif
173} 177}
174 178
175/** 179/**
176 * Raise an error. Delete input and set the focus after showing 180 * Raise an error. Delete input and set the focus after showing
177 * the error to the user 181 * the error to the user
178 */ 182 */
179void PasswordDialogImpl::error( const QString& caption, const QString& text ) { 183void PasswordDialogImpl::error( const QString& caption, const QString& text ) {
180 m_isSet = false; 184 m_isSet = false;
181 QMessageBox::critical(this,caption, text, 185 QMessageBox::critical(this,caption, text,
182 QMessageBox::Ok, QMessageBox::NoButton ); 186 QMessageBox::Ok, QMessageBox::NoButton );
183 187
184 m_pass->setText(""); 188 m_pass->setText("");
185 m_pass->setFocus(); 189 m_pass->setFocus();
186 190
187 m_confirm->setText(""); 191 m_confirm->setText("");
188} 192}
189 193
190void PasswordDialogImpl::slotToggleEcho( bool b ) { 194void PasswordDialogImpl::slotToggleEcho( bool b ) {
191 m_pass-> setEchoMode( b ? QLineEdit::Normal : QLineEdit::Password ); 195 m_pass-> setEchoMode( b ? QLineEdit::Normal : QLineEdit::Password );
192 m_confirm->setEchoMode( b ? QLineEdit::Normal : QLineEdit::Password ); 196 m_confirm->setEchoMode( b ? QLineEdit::Normal : QLineEdit::Password );
193} 197}
194 198
195///////////////////////// 199/////////////////////////
196/// static functions 200/// static functions
197/// 201///
198 202
199/** 203/**
200 * Ask whether or not we need to show the dialog. It returns true if 204 * Ask whether or not we need to show the dialog. It returns true if
201 * no root password is set so that the user will be able to set one. 205 * no root password is set so that the user will be able to set one.
202 */ 206 */
203bool PasswordDialogImpl::needDialog() { 207bool PasswordDialogImpl::needDialog() {
204 /* 208 /*
205 * This can cope with no password and shadow passwords 209 * This can cope with no password and shadow passwords
206 * Let us go through the user database until we find 'root' and then 210 * Let us go through the user database until we find 'root' and then
207 * see if it is 'shadow' and see if shadow is empty or see if the password is empty 211 * see if it is 'shadow' and see if shadow is empty or see if the password is empty
208 */ 212 */
209 bool need = false; 213 bool need = false;
210 struct passwd *pwd; 214 struct passwd *pwd;
211 ::setpwent(); 215 ::setpwent();
212 216
213 while((pwd = ::getpwent() ) ) { 217 while((pwd = ::getpwent() ) ) {
214 /* found root */ 218 /* found root */
215 if( pwd->pw_uid == 0 ) { 219 if( pwd->pw_uid == 0 ) {
216 QString str = QString::fromLatin1(pwd->pw_passwd ); 220 QString str = QString::fromLatin1(pwd->pw_passwd );
217 221
218 /* 222 /*
219 * If str is really empty it is passwordless anyway... or '*' is a hint to set one 223 * If str is really empty it is passwordless anyway... or '*' is a hint to set one
220 * on OE/Familiar 224 * on OE/Familiar
221 * else it is shadow based 225 * else it is shadow based
222 */ 226 */
223 if(str.isEmpty() || str == '*' ) 227 if(str.isEmpty() || str == '*' )
224 need = true; 228 need = true;
225 else if ( str == 'x' ) 229 else if ( str == 'x' )
226#ifdef OPIE_LOGIN_SHADOW_PW 230#ifdef OPIE_LOGIN_SHADOW_PW
227 need = QString::fromLatin1( ::getspnam( pwd->pw_name )->sp_pwdp ).isEmpty(); 231 need = QString::fromLatin1( ::getspnam( pwd->pw_name )->sp_pwdp ).isEmpty();
228#else 232#else
229 ; 233 ;
230#endif 234#endif
231 break; 235 break;
232 } 236 }
233 } 237 }
234 ::endpwent(); 238 ::endpwent();
235 239
236 return need; 240 return need;
237} 241}
diff --git a/noncore/settings/aqpkg/ipkg.cpp b/noncore/settings/aqpkg/ipkg.cpp
index dd9e78d..c5c6387 100644
--- a/noncore/settings/aqpkg/ipkg.cpp
+++ b/noncore/settings/aqpkg/ipkg.cpp
@@ -1,611 +1,618 @@
1/* 1/*
2                This file is part of the OPIE Project 2                This file is part of the OPIE Project
3 3
4 =. Copyright (c) 2002 Andy Qua <andy.qua@blueyonder.co.uk> 4 =. Copyright (c) 2002 Andy Qua <andy.qua@blueyonder.co.uk>
5             .=l. Dan Williams <drw@handhelds.org> 5             .=l. Dan Williams <drw@handhelds.org>
6           .>+-= 6           .>+-=
7 _;:,     .>    :=|. This file is free software; you can 7 _;:,     .>    :=|. This file is free software; you can
8.> <`_,   >  .   <= redistribute it and/or modify it under 8.> <`_,   >  .   <= redistribute it and/or modify it under
9:`=1 )Y*s>-.--   : the terms of the GNU General Public 9:`=1 )Y*s>-.--   : the terms of the GNU General Public
10.="- .-=="i,     .._ License as published by the Free Software 10.="- .-=="i,     .._ License as published by the Free Software
11 - .   .-<_>     .<> Foundation; either version 2 of the License, 11 - .   .-<_>     .<> Foundation; either version 2 of the License,
12     ._= =}       : or (at your option) any later version. 12     ._= =}       : or (at your option) any later version.
13    .%`+i>       _;_. 13    .%`+i>       _;_.
14    .i_,=:_.      -<s. This file is distributed in the hope that 14    .i_,=:_.      -<s. This file is distributed in the hope that
15     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 15     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
16    : ..    .:,     . . . without even the implied warranty of 16    : ..    .:,     . . . without even the implied warranty of
17    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 17    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
18  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU General 18  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU General
19..}^=.=       =       ; Public License for more details. 19..}^=.=       =       ; Public License for more details.
20++=   -.     .`     .: 20++=   -.     .`     .:
21 :     =  ...= . :.=- You should have received a copy of the GNU 21 :     =  ...= . :.=- You should have received a copy of the GNU
22 -.   .:....=;==+<; General Public License along with this file; 22 -.   .:....=;==+<; General Public License along with this file;
23  -_. . .   )=.  = see the file COPYING. If not, write to the 23  -_. . .   )=.  = see the file COPYING. If not, write to the
24    --        :-=` Free Software Foundation, Inc., 24    --        :-=` Free Software Foundation, Inc.,
25 59 Temple Place - Suite 330, 25 59 Temple Place - Suite 330,
26 Boston, MA 02111-1307, USA. 26 Boston, MA 02111-1307, USA.
27 27
28*/ 28*/
29 29
30#include <opie2/oprocess.h> 30#include <opie2/oprocess.h>
31 31
32#ifdef QWS 32#ifdef QWS
33#include <qpe/qpeapplication.h> 33#include <qpe/qpeapplication.h>
34#else 34#else
35#include <qapplication.h> 35#include <qapplication.h>
36#endif 36#endif
37#include <qdir.h> 37#include <qdir.h>
38#include <qfile.h> 38#include <qfile.h>
39#include <qtextstream.h> 39#include <qtextstream.h>
40 40
41#include "utils.h" 41#include "utils.h"
42#include "ipkg.h" 42#include "ipkg.h"
43#include "global.h" 43#include "global.h"
44 44
45using namespace Opie::Core; 45using namespace Opie::Core;
46Ipkg :: Ipkg() 46Ipkg :: Ipkg()
47{ 47{
48 proc = 0; 48 proc = 0;
49} 49}
50 50
51Ipkg :: ~Ipkg() 51Ipkg :: ~Ipkg()
52{ 52{
53} 53}
54 54
55// Option is what we are going to do - install, upgrade, download, reinstall 55// Option is what we are going to do - install, upgrade, download, reinstall
56// package is the package name to install - either a fully qualified path and ipk 56// package is the package name to install - either a fully qualified path and ipk
57// file (if stored locally) or just the name of the package (for a network package) 57// file (if stored locally) or just the name of the package (for a network package)
58// packageName is the package name - (for a network package this will be the same as 58// packageName is the package name - (for a network package this will be the same as
59// package parameter) 59// package parameter)
60// dest is the destination alias (from ipk.conf) 60// dest is the destination alias (from ipk.conf)
61// destDir is the dir that the destination alias points to (used to link to root) 61// destDir is the dir that the destination alias points to (used to link to root)
62// flags is the ipkg options flags 62// flags is the ipkg options flags
63// dir is the directory to run ipkg in (defaults to "") 63// dir is the directory to run ipkg in (defaults to "")
64void Ipkg :: runIpkg() 64void Ipkg :: runIpkg()
65{ 65{
66 error = false; 66 error = false;
67 QStringList commands; 67 QStringList commands;
68 68
69 QDir::setCurrent( "/tmp" ); 69 QDir::setCurrent( "/tmp" );
70 70
71 if ( runtimeDir != "" ) 71 if ( runtimeDir != "" )
72 { 72 {
73 commands << "cd "; 73 commands << "cd ";
74 commands << runtimeDir; 74 commands << runtimeDir;
75 commands << ";"; 75 commands << ";";
76 } 76 }
77 commands << "ipkg" << "-V" << QString::number( infoLevel ) << "-force-defaults"; 77 commands << "ipkg" << "-V" << QString::number( infoLevel ) << "-force-defaults";
78 78
79 // only set the destination for an install operation 79 // only set the destination for an install operation
80 if ( option == "install" ) 80 if ( option == "install" )
81 commands << "-dest" << destination; 81 commands << "-dest" << destination;
82 82
83 83
84 if ( option != "update" && option != "download" ) 84 if ( option != "update" && option != "download" )
85 { 85 {
86 if ( flags & FORCE_DEPENDS ) 86 if ( flags & FORCE_DEPENDS )
87 commands << "-force-depends"; 87 commands << "-force-depends";
88 if ( flags & FORCE_REINSTALL ) 88 if ( flags & FORCE_REINSTALL )
89 commands << "-force-reinstall"; 89 commands << "-force-reinstall";
90 if ( flags & FORCE_REMOVE ) 90 if ( flags & FORCE_REMOVE )
91 commands << "-force-removal-of-essential-packages"; 91 commands << "-force-removal-of-essential-packages";
92 if ( flags & FORCE_OVERWRITE ) 92 if ( flags & FORCE_OVERWRITE )
93 commands << "-force-overwrite"; 93 commands << "-force-overwrite";
94 if ( infoLevel == 3 ) 94 if ( infoLevel == 3 )
95 commands << "-verbose_wget"; 95 commands << "-verbose_wget";
96 96
97 // Handle make links 97 // Handle make links
98 // Rules - If make links is switched on, create links to root 98 // Rules - If make links is switched on, create links to root
99 // if destDir is NOT / 99 // if destDir is NOT /
100 if ( flags & MAKE_LINKS ) 100 if ( flags & MAKE_LINKS )
101 { 101 {
102 // If destDir == / turn off make links as package is being insalled 102 // If destDir == / turn off make links as package is being insalled
103 // to root already. 103 // to root already.
104 if ( destDir == "/" ) 104 if ( destDir == "/" )
105 flags ^= MAKE_LINKS; 105 flags ^= MAKE_LINKS;
106 } 106 }
107 } 107 }
108 108
109#ifdef X86 109#ifdef X86
110 commands << "-f"; 110 commands << "-f";
111 commands << IPKG_CONF; 111 commands << IPKG_CONF;
112#endif 112#endif
113 113
114 114
115 if ( option == "reinstall" ) 115 if ( option == "reinstall" )
116 commands << "install"; 116 commands << "install";
117 else 117 else
118 commands << option; 118 commands << option;
119 if ( package != "" ) 119 if ( package != "" )
120 commands << package; 120 commands << package;
121 121
122 122
123 if ( package != "" ) 123 if ( package != "" )
124 emit outputText( tr( "Dealing with package %1" ).arg( package) ); 124 emit outputText( tr( "Dealing with package %1" ).arg( package) );
125 125
126 qApp->processEvents(); 126 qApp->processEvents();
127 127
128 // If we are removing, reinstalling or upgrading packages and make links option is selected 128 // If we are removing, reinstalling or upgrading packages and make links option is selected
129 // create the links 129 // create the links
130 if ( option == "remove" || option == "reinstall" || option == "upgrade" ) 130 if ( option == "remove" || option == "reinstall" || option == "upgrade" )
131 { 131 {
132 createLinks = false; 132 createLinks = false;
133 if ( flags & MAKE_LINKS ) 133 if ( flags & MAKE_LINKS )
134 { 134 {
135 emit outputText( tr( "Removing symbolic links...\n" ) ); 135 emit outputText( tr( "Removing symbolic links...\n" ) );
136 linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir ); 136 linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir );
137 emit outputText( QString( " " ) ); 137 emit outputText( QString( " " ) );
138 } 138 }
139 } 139 }
140 140
141 // Execute command 141 // Execute command
142 dependantPackages = new QList<QString>; 142 dependantPackages = new QList<QString>;
143 dependantPackages->setAutoDelete( true ); 143 dependantPackages->setAutoDelete( true );
144 144
145 executeIpkgCommand( commands, option ); 145 executeIpkgCommand( commands, option );
146} 146}
147 147
148void Ipkg :: createSymLinks() 148void Ipkg :: createSymLinks()
149{ 149{
150 if ( option == "install" || option == "reinstall" || option == "upgrade" ) 150 if ( option == "install" || option == "reinstall" || option == "upgrade" )
151 { 151 {
152 // If we are not removing packages and make links option is selected 152 // If we are not removing packages and make links option is selected
153 // create the links 153 // create the links
154 createLinks = true; 154 createLinks = true;
155 if ( flags & MAKE_LINKS ) 155 if ( flags & MAKE_LINKS )
156 { 156 {
157 emit outputText( " " ); 157 emit outputText( " " );
158 emit outputText( tr( "Creating symbolic links for %1." ).arg( package) ); 158 emit outputText( tr( "Creating symbolic links for %1." ).arg( package) );
159 159
160 linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir ); 160 linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir );
161 161
162 // link dependant packages that were installed with this release 162 // link dependant packages that were installed with this release
163 QString *pkg; 163 QString *pkg;
164 for ( pkg = dependantPackages->first(); pkg != 0; pkg = dependantPackages->next() ) 164 for ( pkg = dependantPackages->first(); pkg != 0; pkg = dependantPackages->next() )
165 { 165 {
166 if ( *pkg == package ) 166 if ( *pkg == package )
167 continue; 167 continue;
168 emit outputText( " " ); 168 emit outputText( " " );
169 emit outputText( tr( "Creating symbolic links for %1" ).arg( *pkg ) ); 169 emit outputText( tr( "Creating symbolic links for %1" ).arg( *pkg ) );
170 linkPackage( Utils::getPackageNameFromIpkFilename( *pkg ), destination, destDir ); 170 linkPackage( Utils::getPackageNameFromIpkFilename( *pkg ), destination, destDir );
171 } 171 }
172 } 172 }
173 } 173 }
174 174
175 delete dependantPackages; 175 delete dependantPackages;
176 176
177 emit outputText( tr("Finished") ); 177 emit outputText( tr("Finished") );
178 emit outputText( "" ); 178 emit outputText( "" );
179} 179}
180 180
181void Ipkg :: removeStatusEntry() 181void Ipkg :: removeStatusEntry()
182{ 182{
183 QString statusFile = destDir; 183 QString statusFile = destDir;
184 if ( statusFile.right( 1 ) != "/" ) 184 if ( statusFile.right( 1 ) != "/" )
185 statusFile.append( "/" ); 185 statusFile.append( "/" );
186 statusFile.append( "usr/lib/ipkg/status" ); 186 statusFile.append( "usr/lib/ipkg/status" );
187 QString outStatusFile = statusFile; 187 QString outStatusFile = statusFile;
188 outStatusFile.append( ".tmp" ); 188 outStatusFile.append( ".tmp" );
189 189
190 emit outputText( "" ); 190 emit outputText( "" );
191 emit outputText( tr("Removing status entry...") ); 191 emit outputText( tr("Removing status entry...") );
192 QString tempstr = tr("status file - "); 192 QString tempstr = tr("status file - ");
193 tempstr.append( statusFile ); 193 tempstr.append( statusFile );
194 emit outputText( tempstr ); 194 emit outputText( tempstr );
195 tempstr = tr("package - "); 195 tempstr = tr("package - ");
196 tempstr.append( package ); 196 tempstr.append( package );
197 emit outputText( tempstr ); 197 emit outputText( tempstr );
198 198
199 QFile readFile( statusFile ); 199 QFile readFile( statusFile );
200 QFile writeFile( outStatusFile ); 200 QFile writeFile( outStatusFile );
201 201
202 if ( !readFile.open( IO_ReadOnly ) ) 202 if ( !readFile.open( IO_ReadOnly ) )
203 { 203 {
204 tempstr = tr("Couldn't open status file - "); 204 tempstr = tr("Couldn't open status file - ");
205 tempstr.append( statusFile ); 205 tempstr.append( statusFile );
206 emit outputText( tempstr ); 206 emit outputText( tempstr );
207 return; 207 return;
208 } 208 }
209 209
210 if ( !writeFile.open( IO_WriteOnly ) ) 210 if ( !writeFile.open( IO_WriteOnly ) )
211 { 211 {
212 tempstr = tr("Couldn't create tempory status file - "); 212 tempstr = tr("Couldn't create temporary status file - ");
213 tempstr.append( outStatusFile ); 213 tempstr.append( outStatusFile );
214 emit outputText( tempstr ); 214 emit outputText( tempstr );
215 return; 215 return;
216 } 216 }
217 217
218 int i = 0; 218 int i = 0;
219 219
220 QTextStream readStream( &readFile ); 220 QTextStream readStream( &readFile );
221 QTextStream writeStream( &writeFile ); 221 QTextStream writeStream( &writeFile );
222 QString line; 222 QString line;
223 223
224 char k[21]; 224 char k[21];
225 char v[1001]; 225 char v[1001];
226 QString key; 226 QString key;
227 QString value; 227 QString value;
228 228
229 while ( !readStream.atEnd() ) 229 while ( !readStream.atEnd() )
230 { 230 {
231 //read new line 231 //read new line
232 line = readStream.readLine(); 232 line = readStream.readLine();
233 233
234 if ( line.contains( ":", TRUE ) ) 234 if ( line.contains( ":", TRUE ) )
235 { 235 {
236 //grep key and value from line 236 //grep key and value from line
237 k[0] = '\0'; 237 k[0] = '\0';
238 v[0] = '\0'; 238 v[0] = '\0';
239 sscanf( line, "%[^:]: %[^\n]", k, v ); 239 sscanf( line, "%[^:]: %[^\n]", k, v );
240 key = k; 240 key = k;
241 value = v; 241 value = v;
242 key = key.stripWhiteSpace(); 242 key = key.stripWhiteSpace();
243 value = value.stripWhiteSpace(); 243 value = value.stripWhiteSpace();
244 } else { 244 } else {
245 key = ""; 245 key = "";
246 value = ""; 246 value = "";
247 } 247 }
248 248
249 if ( key == "Package" && value == package ) 249 if ( key == "Package" && value == package )
250 { 250 {
251 //skip lines from the deleted package 251 //skip lines from the deleted package
252 while ( ( !readStream.atEnd() ) && ( line.stripWhiteSpace() != "" ) ) 252 while ( ( !readStream.atEnd() ) && ( line.stripWhiteSpace() != "" ) )
253 { 253 {
254 line = readStream.readLine(); 254 line = readStream.readLine();
255 } 255 }
256 } else { 256 } else {
257 257
258 //write other lines into the tempfile 258 //write other lines into the tempfile
259 writeStream << line << "\n"; 259 writeStream << line << "\n";
260 260
261 // Improve UI responsiveness 261 // Improve UI responsiveness
262 i++; 262 i++;
263 if ( ( i % 50 ) == 0 ) 263 if ( ( i % 50 ) == 0 )
264 qApp->processEvents(); 264 qApp->processEvents();
265 } 265 }
266 } 266 }
267 267
268 readFile.close(); 268 readFile.close();
269 writeFile.close(); 269 writeFile.close();
270 270
271 // Remove old status file and put tmp stats file in its place 271 // Remove old status file and put tmp stats file in its place
272 remove( statusFile ); 272 remove( statusFile );
273 rename( outStatusFile, statusFile ); 273 if (::rename( outStatusFile, statusFile ) == -1)
274 {
275 tempstr = tr("Couldn't rename temporary status file - ");
276 tempstr.append( outStatusFile );
277 tempstr.append( tr("to status file - ") );
278 tempstr.append( statusFile );
279 emit outputText( tempstr );
280 }
274 } 281 }
275 282
276int Ipkg :: executeIpkgLinkCommand( QStringList *cmd ) 283int Ipkg :: executeIpkgLinkCommand( QStringList *cmd )
277{ 284{
278 // If one is already running - should never be but just to be safe 285 // If one is already running - should never be but just to be safe
279 if ( proc ) 286 if ( proc )
280 { 287 {
281 delete proc; 288 delete proc;
282 proc = 0; 289 proc = 0;
283 } 290 }
284 291
285 // OK we're gonna use OProcess to run this thing 292 // OK we're gonna use OProcess to run this thing
286 proc = new OProcess(); 293 proc = new OProcess();
287 aborted = false; 294 aborted = false;
288 295
289 // Connect up our slots 296 // Connect up our slots
290 connect(proc, SIGNAL(processExited(Opie::Core::OProcess*)), 297 connect(proc, SIGNAL(processExited(Opie::Core::OProcess*)),
291 this, SLOT( linkProcessFinished())); 298 this, SLOT( linkProcessFinished()));
292 connect(proc, SIGNAL(receivedStdout(Opie::Core::OProcess*,char*,int)), 299 connect(proc, SIGNAL(receivedStdout(Opie::Core::OProcess*,char*,int)),
293 this, SLOT(linkCommandStdout(Opie::Core::OProcess*,char*,int))); 300 this, SLOT(linkCommandStdout(Opie::Core::OProcess*,char*,int)));
294 301
295 *proc << *cmd; 302 *proc << *cmd;
296 303
297 if(!proc->start(OProcess::NotifyOnExit, OProcess::All)) 304 if(!proc->start(OProcess::NotifyOnExit, OProcess::All))
298 { 305 {
299 emit outputText( tr("Couldn't start ipkg-link process" ) ); 306 emit outputText( tr("Couldn't start ipkg-link process" ) );
300 } 307 }
301 308
302 return 0; 309 return 0;
303} 310}
304 311
305void Ipkg::linkProcessFinished() 312void Ipkg::linkProcessFinished()
306{ 313{
307 // Report that the link process succeeded/failed 314 // Report that the link process succeeded/failed
308 315
309 if ( error ) 316 if ( error )
310 emit outputText( tr("Symbolic linking failed!\n") ); 317 emit outputText( tr("Symbolic linking failed!\n") );
311 else 318 else
312 emit outputText( tr("Symbolic linking succeeded.\n") ); 319 emit outputText( tr("Symbolic linking succeeded.\n") );
313 320
314 delete proc; 321 delete proc;
315 proc = 0; 322 proc = 0;
316 finished = true; 323 finished = true;
317} 324}
318 325
319void Ipkg::linkCommandStdout(OProcess*, char *buffer, int buflen) 326void Ipkg::linkCommandStdout(OProcess*, char *buffer, int buflen)
320{ 327{
321 QString lineStr = buffer; 328 QString lineStr = buffer;
322 if ( lineStr[buflen-1] == '\n' ) 329 if ( lineStr[buflen-1] == '\n' )
323 buflen --; 330 buflen --;
324 lineStr = lineStr.left( buflen ); 331 lineStr = lineStr.left( buflen );
325 emit outputText( lineStr ); 332 emit outputText( lineStr );
326 333
327 if ( lineStr.find( " not found." ) != -1 ) 334 if ( lineStr.find( " not found." ) != -1 )
328 { 335 {
329 // Capture ipkg-link errors 336 // Capture ipkg-link errors
330 error = true; 337 error = true;
331 } 338 }
332 339
333 buffer[0] = '\0'; 340 buffer[0] = '\0';
334} 341}
335 342
336int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString /*option*/ ) 343int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString /*option*/ )
337{ 344{
338 // If one is already running - should never be but just to be safe 345 // If one is already running - should never be but just to be safe
339 if ( proc ) 346 if ( proc )
340 { 347 {
341 delete proc; 348 delete proc;
342 proc = 0; 349 proc = 0;
343 } 350 }
344 351
345 // OK we're gonna use OProcess to run this thing 352 // OK we're gonna use OProcess to run this thing
346 proc = new OProcess(); 353 proc = new OProcess();
347 aborted = false; 354 aborted = false;
348 355
349 356
350 // Connect up our slots 357 // Connect up our slots
351 connect(proc, SIGNAL(processExited(Opie::Core::OProcess*)), 358 connect(proc, SIGNAL(processExited(Opie::Core::OProcess*)),
352 this, SLOT( processFinished())); 359 this, SLOT( processFinished()));
353 360
354 connect(proc, SIGNAL(receivedStdout(Opie::Core::OProcess*,char*,int)), 361 connect(proc, SIGNAL(receivedStdout(Opie::Core::OProcess*,char*,int)),
355 this, SLOT(commandStdout(Opie::Core::OProcess*,char*,int))); 362 this, SLOT(commandStdout(Opie::Core::OProcess*,char*,int)));
356 363
357 connect(proc, SIGNAL(receivedStderr(Opie::Core::OProcess*,char*,int)), 364 connect(proc, SIGNAL(receivedStderr(Opie::Core::OProcess*,char*,int)),
358 this, SLOT(commandStderr(Opie::Core::OProcess*,char*,int))); 365 this, SLOT(commandStderr(Opie::Core::OProcess*,char*,int)));
359 366
360 for ( QStringList::Iterator it = cmd.begin(); it != cmd.end(); ++it ) 367 for ( QStringList::Iterator it = cmd.begin(); it != cmd.end(); ++it )
361 { 368 {
362 *proc << (*it).latin1(); 369 *proc << (*it).latin1();
363 } 370 }
364 371
365 // Start the process going 372 // Start the process going
366 finished = false; 373 finished = false;
367 if(!proc->start(OProcess::NotifyOnExit, OProcess::All)) 374 if(!proc->start(OProcess::NotifyOnExit, OProcess::All))
368 { 375 {
369 emit outputText( tr("Couldn't start ipkg process" ) ); 376 emit outputText( tr("Couldn't start ipkg process" ) );
370 } 377 }
371 378
372 return 0; 379 return 0;
373} 380}
374 381
375void Ipkg::commandStdout(OProcess*, char *buffer, int buflen) 382void Ipkg::commandStdout(OProcess*, char *buffer, int buflen)
376{ 383{
377 QString lineStr = buffer; 384 QString lineStr = buffer;
378 if ( lineStr[buflen-1] == '\n' ) 385 if ( lineStr[buflen-1] == '\n' )
379 buflen --; 386 buflen --;
380 lineStr = lineStr.left( buflen ); 387 lineStr = lineStr.left( buflen );
381 emit outputText( lineStr ); 388 emit outputText( lineStr );
382 389
383 // check if we are installing dependant packages 390 // check if we are installing dependant packages
384 if ( option == "install" || option == "reinstall" ) 391 if ( option == "install" || option == "reinstall" )
385 { 392 {
386 // Need to keep track of any dependant packages that get installed 393 // Need to keep track of any dependant packages that get installed
387 // so that we can create links to them as necessary 394 // so that we can create links to them as necessary
388 if ( lineStr.startsWith( "Installing " ) ) 395 if ( lineStr.startsWith( "Installing " ) )
389 { 396 {
390 int start = lineStr.find( " " ) + 1; 397 int start = lineStr.find( " " ) + 1;
391 int end = lineStr.find( " ", start ); 398 int end = lineStr.find( " ", start );
392 QString *package = new QString( lineStr.mid( start, end-start ) ); 399 QString *package = new QString( lineStr.mid( start, end-start ) );
393 dependantPackages->append( package ); 400 dependantPackages->append( package );
394 } 401 }
395 } 402 }
396 else if ( option == "remove" && !( flags & FORCE_DEPENDS ) && 403 else if ( option == "remove" && !( flags & FORCE_DEPENDS ) &&
397 lineStr.find( "is depended upon by packages:" ) != -1 ) 404 lineStr.find( "is depended upon by packages:" ) != -1 )
398 { 405 {
399 // Ipkg should send this to STDERR, but doesn't - so trap here 406 // Ipkg should send this to STDERR, but doesn't - so trap here
400 error = true; 407 error = true;
401 } 408 }
402 409
403 buffer[0] = '\0'; 410 buffer[0] = '\0';
404} 411}
405 412
406void Ipkg::commandStderr(OProcess*, char *buffer, int buflen) 413void Ipkg::commandStderr(OProcess*, char *buffer, int buflen)
407{ 414{
408 QString lineStr = buffer; 415 QString lineStr = buffer;
409 if ( lineStr[buflen-1] == '\n' ) 416 if ( lineStr[buflen-1] == '\n' )
410 buflen --; 417 buflen --;
411 lineStr=lineStr.left( buflen ); 418 lineStr=lineStr.left( buflen );
412 emit outputText( lineStr ); 419 emit outputText( lineStr );
413 buffer[0] = '\0'; 420 buffer[0] = '\0';
414 error = true; 421 error = true;
415} 422}
416 423
417void Ipkg::processFinished() 424void Ipkg::processFinished()
418{ 425{
419 // Finally, if we are removing a package, remove its entry from the <destdir>/usr/lib/ipkg/status file 426 // Finally, if we are removing a package, remove its entry from the <destdir>/usr/lib/ipkg/status file
420 // to workaround an ipkg bug which stops reinstall to a different location 427 // to workaround an ipkg bug which stops reinstall to a different location
421 428
422 if ( !error && option == "remove" ) 429 if ( !error && option == "remove" )
423 removeStatusEntry(); 430 removeStatusEntry();
424 431
425 delete proc; 432 delete proc;
426 proc = 0; 433 proc = 0;
427 finished = true; 434 finished = true;
428 435
429 emit ipkgFinished(); 436 emit ipkgFinished();
430} 437}
431 438
432 439
433void Ipkg :: abort() 440void Ipkg :: abort()
434{ 441{
435 if ( proc ) 442 if ( proc )
436 { 443 {
437 proc->kill(); 444 proc->kill();
438 aborted = true; 445 aborted = true;
439 } 446 }
440} 447}
441 448
442void Ipkg :: linkPackage( const QString &packFileName, const QString &dest, const QString &destDir ) 449void Ipkg :: linkPackage( const QString &packFileName, const QString &dest, const QString &destDir )
443{ 450{
444 Q_CONST_UNUSED( destDir ) 451 Q_CONST_UNUSED( destDir )
445 if ( dest == "root" || dest == "/" ) 452 if ( dest == "root" || dest == "/" )
446 return; 453 return;
447 454
448 if( option == "remove" || option == "reinstall" || option == "upgrade" ) 455 if( option == "remove" || option == "reinstall" || option == "upgrade" )
449 { 456 {
450 QStringList commands; 457 QStringList commands;
451 458
452 if ( runtimeDir != "" ) 459 if ( runtimeDir != "" )
453 { 460 {
454 commands << "cd "; 461 commands << "cd ";
455 commands << runtimeDir; 462 commands << runtimeDir;
456 commands << ";"; 463 commands << ";";
457 } 464 }
458 commands << "ipkg-link" << "remove" << packFileName; 465 commands << "ipkg-link" << "remove" << packFileName;
459 executeIpkgLinkCommand( &commands ); 466 executeIpkgLinkCommand( &commands );
460 } 467 }
461 468
462 if( option == "install" || option == "reinstall" || option == "upgrade" ) 469 if( option == "install" || option == "reinstall" || option == "upgrade" )
463 { 470 {
464 QStringList commands; 471 QStringList commands;
465 if ( runtimeDir != "" ) 472 if ( runtimeDir != "" )
466 { 473 {
467 commands << "cd "; 474 commands << "cd ";
468 commands << runtimeDir; 475 commands << runtimeDir;
469 commands << ";"; 476 commands << ";";
470 } 477 }
471 commands << "ipkg-link" << "add" << packFileName; 478 commands << "ipkg-link" << "add" << packFileName;
472 executeIpkgLinkCommand( &commands ); 479 executeIpkgLinkCommand( &commands );
473 } 480 }
474/* 481/*
475 qApp->processEvents(); 482 qApp->processEvents();
476 QStringList *fileList = getList( packFileName, destDir ); 483 QStringList *fileList = getList( packFileName, destDir );
477 qApp->processEvents(); 484 qApp->processEvents();
478 processFileList( fileList, destDir ); 485 processFileList( fileList, destDir );
479 delete fileList;*/ 486 delete fileList;*/
480} 487}
481/* 488/*
482QStringList* Ipkg :: getList( const QString &packageFilename, const QString &destDir ) 489QStringList* Ipkg :: getList( const QString &packageFilename, const QString &destDir )
483{ 490{
484 QString packageFileDir = destDir; 491 QString packageFileDir = destDir;
485 packageFileDir.append( "/usr/lib/ipkg/info/" ); 492 packageFileDir.append( "/usr/lib/ipkg/info/" );
486 packageFileDir.append( packageFilename ); 493 packageFileDir.append( packageFilename );
487 packageFileDir.append( ".list" ); 494 packageFileDir.append( ".list" );
488 QFile f( packageFileDir ); 495 QFile f( packageFileDir );
489 496
490 if ( !f.open(IO_ReadOnly) ) 497 if ( !f.open(IO_ReadOnly) )
491 { 498 {
492 // Couldn't open from dest, try from / 499 // Couldn't open from dest, try from /
493 f.close(); 500 f.close();
494 501
495 packageFileDir = "/usr/lib/ipkg/info/"; 502 packageFileDir = "/usr/lib/ipkg/info/";
496 packageFileDir.append( packageFilename ); 503 packageFileDir.append( packageFilename );
497 packageFileDir.append( ".list" ); 504 packageFileDir.append( ".list" );
498 f.setName( packageFileDir ); 505 f.setName( packageFileDir );
499 if ( ! f.open(IO_ReadOnly) ) 506 if ( ! f.open(IO_ReadOnly) )
500 { 507 {
501 QString tempstr = tr("Could not open :"); 508 QString tempstr = tr("Could not open :");
502 tempstr.append( packageFileDir ); 509 tempstr.append( packageFileDir );
503 emit outputText( tempstr ); 510 emit outputText( tempstr );
504 return (QStringList*)0; 511 return (QStringList*)0;
505 } 512 }
506 } 513 }
507 QStringList *fileList = new QStringList(); 514 QStringList *fileList = new QStringList();
508 QTextStream t( &f ); 515 QTextStream t( &f );
509 while ( !t.eof() ) 516 while ( !t.eof() )
510 *fileList += t.readLine(); 517 *fileList += t.readLine();
511 518
512 f.close(); 519 f.close();
513 return fileList; 520 return fileList;
514} 521}
515 522
516void Ipkg :: processFileList( const QStringList *fileList, const QString &destDir ) 523void Ipkg :: processFileList( const QStringList *fileList, const QString &destDir )
517{ 524{
518 if ( !fileList || fileList->isEmpty() ) 525 if ( !fileList || fileList->isEmpty() )
519 return; 526 return;
520 527
521 QString baseDir = ROOT; 528 QString baseDir = ROOT;
522 529
523 if ( createLinks == true ) 530 if ( createLinks == true )
524 { 531 {
525 for ( uint i=0; i < fileList->count(); i++ ) 532 for ( uint i=0; i < fileList->count(); i++ )
526 { 533 {
527 processLinkDir( (*fileList)[i], baseDir, destDir ); 534 processLinkDir( (*fileList)[i], baseDir, destDir );
528 qApp->processEvents(); 535 qApp->processEvents();
529 } 536 }
530 } 537 }
531 else 538 else
532 { 539 {
533 for ( int i = fileList->count()-1; i >= 0 ; i-- ) 540 for ( int i = fileList->count()-1; i >= 0 ; i-- )
534 { 541 {
535 processLinkDir( (*fileList)[i], baseDir, destDir ); 542 processLinkDir( (*fileList)[i], baseDir, destDir );
536 qApp->processEvents(); 543 qApp->processEvents();
537 } 544 }
538 } 545 }
539} 546}
540 547
541void Ipkg :: processLinkDir( const QString &file, const QString &destDir, const QString &baseDir ) 548void Ipkg :: processLinkDir( const QString &file, const QString &destDir, const QString &baseDir )
542{ 549{
543 550
544 QString sourceFile = baseDir; 551 QString sourceFile = baseDir;
545 sourceFile.append( file ); 552 sourceFile.append( file );
546 553
547 QString linkFile = destDir; 554 QString linkFile = destDir;
548 if ( file.startsWith( "/" ) && destDir.right( 1 ) == "/" ) 555 if ( file.startsWith( "/" ) && destDir.right( 1 ) == "/" )
549 { 556 {
550 linkFile.append( file.mid( 1 ) ); 557 linkFile.append( file.mid( 1 ) );
551 } 558 }
552 else 559 else
553 { 560 {
554 linkFile.append( file ); 561 linkFile.append( file );
555 } 562 }
556 QString text; 563 QString text;
557 if ( createLinks ) 564 if ( createLinks )
558 { 565 {
559 // If this file is a directory (ends with a /) and it doesn't exist, 566 // If this file is a directory (ends with a /) and it doesn't exist,
560 // we need to create it 567 // we need to create it
561 if ( file.right(1) == "/" ) 568 if ( file.right(1) == "/" )
562 { 569 {
563 QFileInfo f( linkFile ); 570 QFileInfo f( linkFile );
564 if ( !f.exists() ) 571 if ( !f.exists() )
565 { 572 {
566 QString tempstr = tr("Creating directory "); 573 QString tempstr = tr("Creating directory ");
567 tempstr.append( linkFile ); 574 tempstr.append( linkFile );
568 emit outputText( tempstr ); 575 emit outputText( tempstr );
569 QDir d; 576 QDir d;
570 d.mkdir( linkFile, true ); 577 d.mkdir( linkFile, true );
571 } 578 }
572// else 579// else
573// emit outputText( QString( "Directory " ) + linkFile + " already exists" ); 580// emit outputText( QString( "Directory " ) + linkFile + " already exists" );
574 581
575 } 582 }
576 else 583 else
577 { 584 {
578 int rc = symlink( sourceFile, linkFile ); 585 int rc = symlink( sourceFile, linkFile );
579 text = ( rc == 0 ? tr( "Linked %1 to %2" ) : tr( "Failed to link %1 to %2" ) ). 586 text = ( rc == 0 ? tr( "Linked %1 to %2" ) : tr( "Failed to link %1 to %2" ) ).
580 arg( sourceFile ). 587 arg( sourceFile ).
581 arg( linkFile ); 588 arg( linkFile );
582 emit outputText( text ); 589 emit outputText( text );
583 } 590 }
584 } 591 }
585 else 592 else
586 { 593 {
587 QFileInfo f( linkFile ); 594 QFileInfo f( linkFile );
588 if ( f.exists() ) 595 if ( f.exists() )
589 { 596 {
590 if ( f.isFile() ) 597 if ( f.isFile() )
591 { 598 {
592 QFile f( linkFile ); 599 QFile f( linkFile );
593 bool rc = f.remove(); 600 bool rc = f.remove();
594 601
595 text = ( rc ? tr( "Removed %1" ) : tr( "Failed to remove %1" ) ).arg( linkFile ); 602 text = ( rc ? tr( "Removed %1" ) : tr( "Failed to remove %1" ) ).arg( linkFile );
596 emit outputText( text ); 603 emit outputText( text );
597 } 604 }
598 else if ( f.isDir() ) 605 else if ( f.isDir() )
599 { 606 {
600 QDir d; 607 QDir d;
601 bool rc = d.rmdir( linkFile, true ); 608 bool rc = d.rmdir( linkFile, true );
602 if ( rc ) 609 if ( rc )
603 { 610 {
604 text = ( rc ? tr( "Removed " ) : tr( "Failed to remove " ) ).arg( linkFile ); 611 text = ( rc ? tr( "Removed " ) : tr( "Failed to remove " ) ).arg( linkFile );
605 emit outputText( text ); 612 emit outputText( text );
606 } 613 }
607 } 614 }
608 } 615 }
609 } 616 }
610} 617}
611*/ 618*/