-rw-r--r-- | core/opie-login/passworddialogimpl.cpp | 6 | ||||
-rw-r--r-- | noncore/settings/aqpkg/ipkg.cpp | 11 |
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 |
46 | extern "C" char* crypt( const char*, const char* ); | 46 | extern "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'. |
54 | static int i64c(int i) { | 54 | static 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'. |
69 | static char *crypt_make_salt() { | 69 | static 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 | */ |
87 | PasswordDialogImpl::PasswordDialogImpl( QWidget* parent ) | 87 | PasswordDialogImpl::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 | ||
91 | PasswordDialogImpl::~PasswordDialogImpl() { | 91 | PasswordDialogImpl::~PasswordDialogImpl() { |
92 | /* qt does the stuff for us */ | 92 | /* qt does the stuff for us */ |
93 | } | 93 | } |
94 | 94 | ||
95 | void PasswordDialogImpl::done(int res) { | 95 | void 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 | */ |
133 | void PasswordDialogImpl::writePassword() { | 133 | void 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 | */ |
179 | void PasswordDialogImpl::error( const QString& caption, const QString& text ) { | 183 | void 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 | ||
190 | void PasswordDialogImpl::slotToggleEcho( bool b ) { | 194 | void 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 | */ |
203 | bool PasswordDialogImpl::needDialog() { | 207 | bool 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 | ||
45 | using namespace Opie::Core; | 45 | using namespace Opie::Core; |
46 | Ipkg :: Ipkg() | 46 | Ipkg :: Ipkg() |
47 | { | 47 | { |
48 | proc = 0; | 48 | proc = 0; |
49 | } | 49 | } |
50 | 50 | ||
51 | Ipkg :: ~Ipkg() | 51 | Ipkg :: ~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 "") |
64 | void Ipkg :: runIpkg() | 64 | void 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 | ||
148 | void Ipkg :: createSymLinks() | 148 | void 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 | ||
181 | void Ipkg :: removeStatusEntry() | 181 | void 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 | ||
276 | int Ipkg :: executeIpkgLinkCommand( QStringList *cmd ) | 283 | int 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 | ||
305 | void Ipkg::linkProcessFinished() | 312 | void 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 | ||
319 | void Ipkg::linkCommandStdout(OProcess*, char *buffer, int buflen) | 326 | void 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 | ||
336 | int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString /*option*/ ) | 343 | int 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 | ||
375 | void Ipkg::commandStdout(OProcess*, char *buffer, int buflen) | 382 | void 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 | ||
406 | void Ipkg::commandStderr(OProcess*, char *buffer, int buflen) | 413 | void 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 | ||
417 | void Ipkg::processFinished() | 424 | void 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 | ||
433 | void Ipkg :: abort() | 440 | void 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 | ||
442 | void Ipkg :: linkPackage( const QString &packFileName, const QString &dest, const QString &destDir ) | 449 | void 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 | /* |
482 | QStringList* Ipkg :: getList( const QString &packageFilename, const QString &destDir ) | 489 | QStringList* 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 | ||
516 | void Ipkg :: processFileList( const QStringList *fileList, const QString &destDir ) | 523 | void 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 | ||
541 | void Ipkg :: processLinkDir( const QString &file, const QString &destDir, const QString &baseDir ) | 548 | void 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 | */ |