summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/opie-login/qdmdialogimpl.cpp4
1 files changed, 2 insertions, 2 deletions
diff --git a/core/opie-login/qdmdialogimpl.cpp b/core/opie-login/qdmdialogimpl.cpp
index 56f0fc0..5d4cd49 100644
--- a/core/opie-login/qdmdialogimpl.cpp
+++ b/core/opie-login/qdmdialogimpl.cpp
@@ -1,535 +1,535 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2001 LISA Systems 2** Copyright (C) 2001 LISA Systems
3** 3**
4** This file is an additional part of Qtopia Environment. 4** This file is an additional part of Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** For further information contact info@lisa.de 14** For further information contact info@lisa.de
15** 15**
16**********************************************************************/ 16**********************************************************************/
17 17
18/* 18/*
19 * AUTHOR: Christian Rahn 19 * AUTHOR: Christian Rahn
20 * EMAIL: cdr@lisa.de 20 * EMAIL: cdr@lisa.de
21 * 21 *
22 * $Id$ 22 * $Id$
23 */ 23 */
24 24
25#include "qdm_config.h" 25#include "qdm_config.h"
26 26
27#ifdef QT_QWS_LOGIN 27#ifdef QT_QWS_LOGIN
28 28
29#include <pwd.h> 29#include <pwd.h>
30#include <unistd.h> 30#include <unistd.h>
31#include <stdlib.h> 31#include <stdlib.h>
32#include <iostream.h> 32#include <iostream.h>
33#include <assert.h> 33#include <assert.h>
34 34
35#include <qlabel.h> 35#include <qlabel.h>
36#include <qregexp.h> 36#include <qregexp.h>
37#include <qdatetime.h> 37#include <qdatetime.h>
38#include <qmessagebox.h> 38#include <qmessagebox.h>
39#include <qcombobox.h> 39#include <qcombobox.h>
40#include <qlineedit.h> 40#include <qlineedit.h>
41#include <qtranslator.h> 41#include <qtranslator.h>
42#include <qpeapplication.h> 42#include <qpe/qpeapplication.h>
43 43
44#include <qwsdisplay_qws.h> 44#include <qwsdisplay_qws.h>
45 45
46#include <string.h> 46#include <string.h>
47#include <stdio.h> 47#include <stdio.h>
48#include <errno.h> 48#include <errno.h>
49#include <unistd.h> 49#include <unistd.h>
50 50
51#include <sys/types.h> 51#include <sys/types.h>
52#include <sys/stat.h> 52#include <sys/stat.h>
53#include <sys/sem.h> 53#include <sys/sem.h>
54#include <sys/shm.h> 54#include <sys/shm.h>
55#include <sys/ipc.h> 55#include <sys/ipc.h>
56 56
57#include <global.h> 57#include <qpe/global.h>
58 58
59#if defined(QT_QWS_LOGIN_USEPAM) 59#if defined(QT_QWS_LOGIN_USEPAM)
60extern "C" { 60extern "C" {
61#include <security/pam_appl.h> 61#include <security/pam_appl.h>
62} 62}
63#else 63#else
64#define _XOPEN_SOURCE 64#define _XOPEN_SOURCE
65#include <unistd.h> 65#include <unistd.h>
66#include <crypt.h> 66#include <crypt.h>
67#endif 67#endif
68 68
69 69
70#include "qdmdialogimpl.h" 70#include "qdmdialogimpl.h"
71#include "../launcher/inputmethods.h" 71#include "../launcher/inputmethods.h"
72 72
73 73
74//---------------------------------------------------------------------------- 74//----------------------------------------------------------------------------
75 75
76//-- taken from semctl man page 76//-- taken from semctl man page
77#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED) 77#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
78//-- union semun is defined by including <sys/sem.h> 78//-- union semun is defined by including <sys/sem.h>
79#else 79#else
80//-- according to X/OPEN we have to define it ourselves 80//-- according to X/OPEN we have to define it ourselves
81union semun { 81union semun {
82 int val; // value for SETVAL 82 int val; // value for SETVAL
83 struct semid_ds *buf; // buffer for IPC_STAT, IPC_SET 83 struct semid_ds *buf; // buffer for IPC_STAT, IPC_SET
84 unsigned short int *array; // array for GETALL, SETALL 84 unsigned short int *array; // array for GETALL, SETALL
85 struct seminfo *__buf; // buffer for IPC_INFO 85 struct seminfo *__buf; // buffer for IPC_INFO
86}; 86};
87#endif 87#endif
88 88
89//---------------------------------------------------------------------------- 89//----------------------------------------------------------------------------
90 90
91static const int ShowClockFreq = 1; 91static const int ShowClockFreq = 1;
92 92
93QDM_SHOWNUSERS; 93QDM_SHOWNUSERS;
94 94
95#ifdef QT_QWS_LOGIN_USEPAM 95#ifdef QT_QWS_LOGIN_USEPAM
96 96
97static const char *_PAM_SERVICE = "xdm"; 97static const char *_PAM_SERVICE = "xdm";
98static const char *PAM_password; 98static const char *PAM_password;
99 99
100typedef const struct pam_message pam_message_type; 100typedef const struct pam_message pam_message_type;
101 101
102static int PAM_conv( int, pam_message_type **, struct pam_response **, void * ); 102static int PAM_conv( int, pam_message_type **, struct pam_response **, void * );
103 103
104static struct pam_conv PAM_conversation = { 104static struct pam_conv PAM_conversation = {
105 &PAM_conv, 105 &PAM_conv,
106 NULL 106 NULL
107}; 107};
108 108
109//---------------------------------------------------------------------------- 109//----------------------------------------------------------------------------
110 110
111static char *COPY_STRING( const char * s ) { 111static char *COPY_STRING( const char * s ) {
112 return (s) ? strdup(s) : (char *)NULL; 112 return (s) ? strdup(s) : (char *)NULL;
113} 113}
114 114
115#define GET_MEM if (reply) realloc(reply, size);\ 115#define GET_MEM if (reply) realloc(reply, size);\
116 else reply = (struct pam_response *)malloc(size); \ 116 else reply = (struct pam_response *)malloc(size); \
117 if (!reply) return PAM_CONV_ERR; \ 117 if (!reply) return PAM_CONV_ERR; \
118 size += sizeof(struct pam_response) 118 size += sizeof(struct pam_response)
119 119
120 120
121static int PAM_conv( int num_msg, pam_message_type **msg, 121static int PAM_conv( int num_msg, pam_message_type **msg,
122 struct pam_response **resp, void *) 122 struct pam_response **resp, void *)
123{ 123{
124 int count = 0, replies = 0; 124 int count = 0, replies = 0;
125 struct pam_response *reply = NULL; 125 struct pam_response *reply = NULL;
126 int size = sizeof(struct pam_response); 126 int size = sizeof(struct pam_response);
127 127
128 for( count = 0; count < num_msg; count++ ) { 128 for( count = 0; count < num_msg; count++ ) {
129 switch (msg[count]->msg_style) { 129 switch (msg[count]->msg_style) {
130 case PAM_PROMPT_ECHO_ON: 130 case PAM_PROMPT_ECHO_ON:
131 /* user name given to PAM already */ 131 /* user name given to PAM already */
132 return PAM_CONV_ERR; 132 return PAM_CONV_ERR;
133 133
134 case PAM_PROMPT_ECHO_OFF: 134 case PAM_PROMPT_ECHO_OFF:
135 /* wants password */ 135 /* wants password */
136 GET_MEM; 136 GET_MEM;
137 reply[replies].resp_retcode = PAM_SUCCESS; 137 reply[replies].resp_retcode = PAM_SUCCESS;
138 reply[replies].resp = COPY_STRING(PAM_password); 138 reply[replies].resp = COPY_STRING(PAM_password);
139 replies++; 139 replies++;
140 /* PAM frees resp */ 140 /* PAM frees resp */
141 break; 141 break;
142 case PAM_TEXT_INFO: 142 case PAM_TEXT_INFO:
143 break; 143 break;
144 default: 144 default:
145 /* unknown or PAM_ERROR_MSG */ 145 /* unknown or PAM_ERROR_MSG */
146 if (reply) free (reply); 146 if (reply) free (reply);
147 return PAM_CONV_ERR; 147 return PAM_CONV_ERR;
148 } 148 }
149 } 149 }
150 if (reply) *resp = reply; 150 if (reply) *resp = reply;
151 return PAM_SUCCESS; 151 return PAM_SUCCESS;
152} 152}
153 153
154#endif 154#endif
155 155
156 156
157//---------------------------------------------------------------------------- 157//----------------------------------------------------------------------------
158 158
159QDMDialogImpl::QDMDialogImpl( QWidget* parent, const char* name, bool modal, WFlags f ) 159QDMDialogImpl::QDMDialogImpl( QWidget* parent, const char* name, bool modal, WFlags f )
160 : QDMDialog( parent, name, modal, f ) 160 : QDMDialog( parent, name, modal, f )
161{ 161{
162 showTime(); 162 showTime();
163 clockTimer = startTimer( ShowClockFreq * 1000 );//-- call timer evry min. 163 clockTimer = startTimer( ShowClockFreq * 1000 );//-- call timer evry min.
164 setActiveWindow(); 164 setActiveWindow();
165 setFocus(); 165 setFocus();
166 166
167 input = new InputMethods( this ); 167 input = new InputMethods( this );
168 input->resize( input->sizeHint() ); 168 input->resize( input->sizeHint() );
169 input->move( 0, height() - input->height() ); 169 input->move( 0, height() - input->height() );
170 170
171 for( int i=0; Shown_Users[i]; ++i ) { 171 for( int i=0; Shown_Users[i]; ++i ) {
172 input_user->insertItem( Shown_Users[i] ); 172 input_user->insertItem( Shown_Users[i] );
173 } 173 }
174 input_user->clearEdit(); 174 input_user->clearEdit();
175 175
176 label_welcome->setText( QDM_WELCOME_STRING ); 176 label_welcome->setText( QDM_WELCOME_STRING );
177 177
178}; 178};
179 179
180 180
181 181
182QDMDialogImpl::~QDMDialogImpl() 182QDMDialogImpl::~QDMDialogImpl()
183{ 183{
184 input->lower(); 184 input->lower();
185 input->close( false ); 185 input->close( false );
186 input->hide(); 186 input->hide();
187 delete input; 187 delete input;
188 input = 0; 188 input = 0;
189 if( parent() ) { 189 if( parent() ) {
190 ((QWidget*)parent())->repaint(true); 190 ((QWidget*)parent())->repaint(true);
191 } 191 }
192}; 192};
193 193
194 194
195void QDMDialogImpl::accept () { }; 195void QDMDialogImpl::accept () { };
196void QDMDialogImpl::reject () { }; 196void QDMDialogImpl::reject () { };
197 197
198 198
199void QDMDialogImpl::showTime( void ) 199void QDMDialogImpl::showTime( void )
200{ 200{
201 label_date->setText( QDate::currentDate().toString() ); 201 label_date->setText( QDate::currentDate().toString() );
202 label_time->setText( QTime::currentTime().toString() ); 202 label_time->setText( QTime::currentTime().toString() );
203} 203}
204 204
205 205
206void QDMDialogImpl::timerEvent( QTimerEvent * e ) 206void QDMDialogImpl::timerEvent( QTimerEvent * e )
207{ 207{
208 if( e->timerId() == clockTimer ) 208 if( e->timerId() == clockTimer )
209 showTime(); 209 showTime();
210} 210}
211 211
212 212
213//---------------------------------------------------------------------------- 213//----------------------------------------------------------------------------
214 214
215void QDMDialogImpl::slot_sleepmode() 215void QDMDialogImpl::slot_sleepmode()
216{ 216{
217 const int button = QMessageBox::warning( this, "Shutdown", tr( "Do you really want to go\nto sleep mode now?" ), 217 const int button = QMessageBox::warning( this, "Shutdown", tr( "Do you really want to go\nto sleep mode now?" ),
218 QString::null, tr( "Cancel" ), QString::null,0,1 ); 218 QString::null, tr( "Cancel" ), QString::null,0,1 );
219 switch( button ) { 219 switch( button ) {
220 case 0: 220 case 0:
221 done( Rejected ); 221 done( Rejected );
222 // Global::execute( cmd_shutdown ); 222 // Global::execute( cmd_shutdown );
223 if( vfork() == 0 ) { 223 if( vfork() == 0 ) {
224 execl( QDM_CMD_SLEEP, 0 ); 224 execl( QDM_CMD_SLEEP, 0 );
225 cerr << "Sleepmode: " << strerror( errno ) << endl; 225 cerr << "Sleepmode: " << strerror( errno ) << endl;
226 } 226 }
227 break; 227 break;
228 228
229 default: 229 default:
230 break; 230 break;
231 } 231 }
232} 232}
233 233
234 234
235//---------------------------------------------------------------------------- 235//----------------------------------------------------------------------------
236 236
237void QDMDialogImpl::slot_shutdown() 237void QDMDialogImpl::slot_shutdown()
238{ 238{
239 const int button = QMessageBox::warning( this, "Shutdown", tr("Do you really want to shut\nthe system down now?"), 239 const int button = QMessageBox::warning( this, "Shutdown", tr("Do you really want to shut\nthe system down now?"),
240 QString::null, tr("Cancel"), QString::null,0,1 ); 240 QString::null, tr("Cancel"), QString::null,0,1 );
241 switch( button ) { 241 switch( button ) {
242 case 0: 242 case 0:
243 done( Rejected ); 243 done( Rejected );
244 // Global::execute( cmd_shutdown ); 244 // Global::execute( cmd_shutdown );
245 if( vfork() == 0 ) { 245 if( vfork() == 0 ) {
246 execl( QDM_CMD_SHUTDOWN, 0 ); 246 execl( QDM_CMD_SHUTDOWN, 0 );
247 cerr << "Shutdown: " << strerror( errno ) << endl; 247 cerr << "Shutdown: " << strerror( errno ) << endl;
248 } 248 }
249 break; 249 break;
250 250
251 default: 251 default:
252 break; 252 break;
253 } 253 }
254} 254}
255 255
256 256
257 257
258 258
259//---------------------------------------------------------------------------- 259//----------------------------------------------------------------------------
260 260
261void QDMDialogImpl::informBadPassword() 261void QDMDialogImpl::informBadPassword()
262{ 262{
263 QMessageBox::warning( this, tr("Password wrong"), 263 QMessageBox::warning( this, tr("Password wrong"),
264 tr("The given password is incorrect") ); 264 tr("The given password is incorrect") );
265} 265}
266 266
267 267
268//---------------------------------------------------------------------------- 268//----------------------------------------------------------------------------
269 269
270#if defined(QT_QWS_LOGIN_USEPAM) 270#if defined(QT_QWS_LOGIN_USEPAM)
271 271
272static bool pwcheck_PAM( const char *user, const char *password ) 272static bool pwcheck_PAM( const char *user, const char *password )
273{ 273{
274 bool pw_correct = false; 274 bool pw_correct = false;
275 int pam_error; 275 int pam_error;
276 int pam_return = 0; 276 int pam_return = 0;
277 pam_handle_t *pamh = 0; 277 pam_handle_t *pamh = 0;
278 PAM_password = password.latin1(); 278 PAM_password = password.latin1();
279 279
280 pam_error = pam_start( _PAM_SERVICE, user, &PAM_conversation, &pamh ); 280 pam_error = pam_start( _PAM_SERVICE, user, &PAM_conversation, &pamh );
281 if( pam_error == PAM_SUCCESS ) { 281 if( pam_error == PAM_SUCCESS ) {
282 pam_error = pam_authenticate( pamh, 0 ); 282 pam_error = pam_authenticate( pamh, 0 );
283 if( pam_error == PAM_SUCCESS ) { 283 if( pam_error == PAM_SUCCESS ) {
284 //-- password correct 284 //-- password correct
285 pw_correct = true; 285 pw_correct = true;
286 pam_return = PAM_SUCCESS; 286 pam_return = PAM_SUCCESS;
287 } else { 287 } else {
288 pam_return = pam_error; 288 pam_return = pam_error;
289 } 289 }
290 } else { 290 } else {
291 // cerr << "PAM error: " << pam_strerror( pamh, pam_error ) << endl; 291 // cerr << "PAM error: " << pam_strerror( pamh, pam_error ) << endl;
292 } 292 }
293 pam_end( pamh, pam_return ); 293 pam_end( pamh, pam_return );
294 return pw_correct; 294 return pw_correct;
295} 295}
296 296
297#else 297#else
298 298
299//---------------------------------------------------------------------------- 299//----------------------------------------------------------------------------
300 300
301static bool pwcheck_Unix( const char *user, const char *password ) 301static bool pwcheck_Unix( const char *user, const char *password )
302{ 302{
303 struct passwd * pword = getpwnam( user ); 303 struct passwd * pword = getpwnam( user );
304 if( pword ) { 304 if( pword ) {
305 if( strcmp( crypt(password, password), pword->pw_passwd) == 0 ) { 305 if( strcmp( crypt(password, password), pword->pw_passwd) == 0 ) {
306 return true; 306 return true;
307 } 307 }
308 } 308 }
309 return false; 309 return false;
310} 310}
311 311
312#endif 312#endif
313 313
314 314
315 315
316//---------------------------------------------------------------------------- 316//----------------------------------------------------------------------------
317 317
318void QDMDialogImpl::slot_login() 318void QDMDialogImpl::slot_login()
319{ 319{
320 bool pw_correct = false; 320 bool pw_correct = false;
321 const char *username = input_user->currentText().latin1(); 321 const char *username = input_user->currentText().latin1();
322 const char *password = input_password->text().latin1(); 322 const char *password = input_password->text().latin1();
323 323
324 assert( username ); 324 assert( username );
325 325
326#if defined(QT_QWS_LOGIN_USEPAM) 326#if defined(QT_QWS_LOGIN_USEPAM)
327 pw_correct = pwcheck_PAM( username, password ); 327 pw_correct = pwcheck_PAM( username, password );
328#else 328#else
329 pw_correct = pwcheck_Unix( username, password ); 329 pw_correct = pwcheck_Unix( username, password );
330#endif 330#endif
331 331
332 if( pw_correct ) { 332 if( pw_correct ) {
333 if( changePersona( username ) ) { 333 if( changePersona( username ) ) {
334 // cerr << "Password correct" << endl; 334 // cerr << "Password correct" << endl;
335 done( Accepted ); 335 done( Accepted );
336 return; 336 return;
337 } 337 }
338 } else { 338 } else {
339 // cerr << "Password incorrect" << endl; 339 // cerr << "Password incorrect" << endl;
340 } 340 }
341 informBadPassword(); 341 informBadPassword();
342} 342}
343 343
344 344
345//---------------------------------------------------------------------------- 345//----------------------------------------------------------------------------
346 346
347bool QDMDialogImpl::changePersona( const char *username ) 347bool QDMDialogImpl::changePersona( const char *username )
348{ 348{
349 int err; 349 int err;
350 350
351 //-- get some info on user <username> 351 //-- get some info on user <username>
352 struct passwd * pword; 352 struct passwd * pword;
353 pword = getpwnam( username ); 353 pword = getpwnam( username );
354 354
355 if( pword == 0 ) 355 if( pword == 0 )
356 return false; 356 return false;
357 357
358 gid_t gid = pword->pw_gid; 358 gid_t gid = pword->pw_gid;
359 uid_t uid = pword->pw_uid; 359 uid_t uid = pword->pw_uid;
360 360
361 //-- some very dirty hacks following 361 //-- some very dirty hacks following
362 // extern int qws_display_id; 362 // extern int qws_display_id;
363 extern QString qws_qtePipeFilename(); 363 extern QString qws_qtePipeFilename();
364 extern QString qws_dataDir(); 364 extern QString qws_dataDir();
365 365
366 366
367 const QString QTEdataDir = qws_dataDir(); 367 const QString QTEdataDir = qws_dataDir();
368 QString QTEdataDirNew = QTEdataDir; 368 QString QTEdataDirNew = QTEdataDir;
369 QTEdataDirNew.replace( QRegExp("root"), username ); 369 QTEdataDirNew.replace( QRegExp("root"), username );
370 370
371 const char *qws_display_str = getenv("QWS_DISPLAY"); 371 const char *qws_display_str = getenv("QWS_DISPLAY");
372 372
373 //-- get name of semaphore and lock 373 //-- get name of semaphore and lock
374 QString pipe = qws_qtePipeFilename(); 374 QString pipe = qws_qtePipeFilename();
375 375
376 //-- change owner of semaphore 376 //-- change owner of semaphore
377 key_t semkey = ftok( pipe.latin1(), 'd' ); 377 key_t semkey = ftok( pipe.latin1(), 'd' );
378 int semid = semget( semkey, 0, 0 ); 378 int semid = semget( semkey, 0, 0 );
379 if( semid < 0 ) 379 if( semid < 0 )
380 cerr << "error: semget, " << strerror( errno ) << endl; 380 cerr << "error: semget, " << strerror( errno ) << endl;
381 381
382 struct shmid_ds shminfo; 382 struct shmid_ds shminfo;
383 semun arg; 383 semun arg;
384 semid_ds semidds; 384 semid_ds semidds;
385 arg.buf = & semidds; 385 arg.buf = & semidds;
386 386
387 if( semctl( semid, 0, IPC_STAT, arg ) < 0 ) 387 if( semctl( semid, 0, IPC_STAT, arg ) < 0 )
388 cerr << "error: semctl stat, " << strerror( errno ) << endl; 388 cerr << "error: semctl stat, " << strerror( errno ) << endl;
389 389
390 arg.buf->sem_perm.uid = uid; 390 arg.buf->sem_perm.uid = uid;
391 arg.buf->sem_perm.gid = gid; 391 arg.buf->sem_perm.gid = gid;
392 392
393 if( semctl( semid, 0, IPC_SET, arg ) < 0 ) 393 if( semctl( semid, 0, IPC_SET, arg ) < 0 )
394 cerr << "error: semctl set, " << strerror( errno ) << endl; 394 cerr << "error: semctl set, " << strerror( errno ) << endl;
395 395
396 //-- change owner of shared memory 396 //-- change owner of shared memory
397 key_t memkey = ftok( pipe.latin1(), 'm' ); 397 key_t memkey = ftok( pipe.latin1(), 'm' );
398 int ramid = shmget( memkey, 0, 0 ); 398 int ramid = shmget( memkey, 0, 0 );
399 if( ramid < 0 ) cerr << "error: shmget, " << strerror( errno ) << endl; 399 if( ramid < 0 ) cerr << "error: shmget, " << strerror( errno ) << endl;
400 400
401 if( shmctl( ramid, IPC_STAT, &shminfo ) < 0 ) 401 if( shmctl( ramid, IPC_STAT, &shminfo ) < 0 )
402 cerr << "error: shmctl stat, " << strerror( errno ) << endl; 402 cerr << "error: shmctl stat, " << strerror( errno ) << endl;
403 403
404 shminfo.shm_perm.uid = uid; 404 shminfo.shm_perm.uid = uid;
405 shminfo.shm_perm.gid = gid; 405 shminfo.shm_perm.gid = gid;
406 406
407 if( shmctl( ramid, IPC_SET, &shminfo ) < 0 ) 407 if( shmctl( ramid, IPC_SET, &shminfo ) < 0 )
408 cerr << "error: shmctl set, " << strerror( errno ) << endl; 408 cerr << "error: shmctl set, " << strerror( errno ) << endl;
409 409
410 //-- change owner of region manager 410 //-- change owner of region manager
411 memkey = ftok( pipe.latin1(), 'r' ); 411 memkey = ftok( pipe.latin1(), 'r' );
412 int regionid = shmget( memkey, 0, 0 ); 412 int regionid = shmget( memkey, 0, 0 );
413 if( regionid < 0 ) 413 if( regionid < 0 )
414 cerr << "error: shmget, " << strerror( errno ) << endl; 414 cerr << "error: shmget, " << strerror( errno ) << endl;
415 415
416 if( shmctl( regionid, IPC_STAT, &shminfo ) < 0 ) 416 if( shmctl( regionid, IPC_STAT, &shminfo ) < 0 )
417 cerr << "error: shmctl stat, " << strerror( errno ) << endl; 417 cerr << "error: shmctl stat, " << strerror( errno ) << endl;
418 418
419 shminfo.shm_perm.uid = uid; 419 shminfo.shm_perm.uid = uid;
420 shminfo.shm_perm.gid = gid; 420 shminfo.shm_perm.gid = gid;
421 421
422 if( shmctl( regionid, IPC_SET, &shminfo ) < 0 ) 422 if( shmctl( regionid, IPC_SET, &shminfo ) < 0 )
423 cerr << "error: shmctl set, " << strerror( errno ) << endl; 423 cerr << "error: shmctl set, " << strerror( errno ) << endl;
424 424
425 // cerr << "ungrabbing qws display: " << qws_display_id << " on lock " << pipe << endl; 425 // cerr << "ungrabbing qws display: " << qws_display_id << " on lock " << pipe << endl;
426 // QWSDisplay::ungrab(); 426 // QWSDisplay::ungrab();
427 427
428 //-- presenting socket-file to new user 428 //-- presenting socket-file to new user
429 chown( pipe.latin1(), uid, gid ); 429 chown( pipe.latin1(), uid, gid );
430 chown( QTEdataDir.latin1(), uid, gid ); 430 chown( QTEdataDir.latin1(), uid, gid );
431 431
432 432
433 //-- another dirty hack - force framebuffer to be writeable... 433 //-- another dirty hack - force framebuffer to be writeable...
434 struct stat devstat; 434 struct stat devstat;
435 if( ! stat( "/dev/fb0", &devstat ) ) { 435 if( ! stat( "/dev/fb0", &devstat ) ) {
436 if( chmod( "/dev/fb0", devstat.st_mode |S_IWOTH |S_IWUSR |S_IWGRP ) ) { 436 if( chmod( "/dev/fb0", devstat.st_mode |S_IWOTH |S_IWUSR |S_IWGRP ) ) {
437 cerr << "chmod error: " << strerror( errno ) << endl; 437 cerr << "chmod error: " << strerror( errno ) << endl;
438 } 438 }
439 } 439 }
440 440
441 err = rename( QTEdataDir, QTEdataDirNew ) ; 441 err = rename( QTEdataDir, QTEdataDirNew ) ;
442 if( err < 0 ) cerr << "error: rename " << strerror(errno) 442 if( err < 0 ) cerr << "error: rename " << strerror(errno)
443 << " , " << QTEdataDir << " -> " << QTEdataDirNew << endl; 443 << " , " << QTEdataDir << " -> " << QTEdataDirNew << endl;
444 444
445 // 445 //
446 //-- actually change uid and gid 446 //-- actually change uid and gid
447 // 447 //
448 // cerr << "changing persona, uid: " << uid << " gid: " << gid << endl; 448 // cerr << "changing persona, uid: " << uid << " gid: " << gid << endl;
449 449
450 err = setgid( gid ); 450 err = setgid( gid );
451 if( err != 0 ) cerr << "error: gid changePersona " << err << endl; 451 if( err != 0 ) cerr << "error: gid changePersona " << err << endl;
452 452
453 err = setuid( uid ); 453 err = setuid( uid );
454 if( err != 0 ) cerr << "error: uid changePersona " << err << endl; 454 if( err != 0 ) cerr << "error: uid changePersona " << err << endl;
455 455
456 456
457 //-- set some environment 457 //-- set some environment
458 setenv( "QWS_DISPLAY", qws_display_str, true ); 458 setenv( "QWS_DISPLAY", qws_display_str, true );
459 setenv( "LOGNAME", username, true ); 459 setenv( "LOGNAME", username, true );
460 setenv( "USER", username, true ); 460 setenv( "USER", username, true );
461 setenv( "HOME", pword->pw_dir, true ); 461 setenv( "HOME", pword->pw_dir, true );
462 462
463 // cout << "QTE data dir: " << qws_dataDir() << endl; 463 // cout << "QTE data dir: " << qws_dataDir() << endl;
464 464
465 //-- I am reborn 465 //-- I am reborn
466 466
467 return true; 467 return true;
468} 468}
469 469
470 470
471 471
472//---------------------------------------------------------------------------- 472//----------------------------------------------------------------------------
473 473
474bool QDMDialogImpl::login( QWidget *parent ) 474bool QDMDialogImpl::login( QWidget *parent )
475{ 475{
476 //-- only when called as 'root' do login-box 476 //-- only when called as 'root' do login-box
477 if( getuid() != 0 ) 477 if( getuid() != 0 )
478 return true; 478 return true;
479 479
480 480
481 //-- are we coming from a 'restart' ? 481 //-- are we coming from a 'restart' ?
482 if( getenv("QDM_STARTED") ) 482 if( getenv("QDM_STARTED") )
483 return true; 483 return true;
484 else 484 else
485 unsetenv("QDM_STARTED"); 485 unsetenv("QDM_STARTED");
486 486
487 487
488#ifndef QT_NO_TRANSLATION 488#ifndef QT_NO_TRANSLATION
489 QString lang = getenv( "LANG" ); 489 QString lang = getenv( "LANG" );
490 490
491 QTranslator * trans = new QTranslator(qApp); 491 QTranslator * trans = new QTranslator(qApp);
492 QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/login.qm"; 492 QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/login.qm";
493 if ( trans->load( tfn )) 493 if ( trans->load( tfn ))
494 qApp->installTranslator( trans ); 494 qApp->installTranslator( trans );
495 else { 495 else {
496 delete trans; 496 delete trans;
497 trans = 0; 497 trans = 0;
498 } 498 }
499#endif 499#endif
500 500
501 if( parent ) parent->erase(); 501 if( parent ) parent->erase();
502 502
503 QDMDialog *dialog = new QDMDialogImpl( parent, "Login", true //); 503 QDMDialog *dialog = new QDMDialogImpl( parent, "Login", true //);
504 ,WStyle_NoBorder | WStyle_Customize ); 504 ,WStyle_NoBorder | WStyle_Customize );
505 505
506#if QT_VERSION >= 300 506#if QT_VERSION >= 300
507 Q_CHECK_PTR( dialog ); 507 Q_CHECK_PTR( dialog );
508#else 508#else
509 CHECK_PTR( dialog ); 509 CHECK_PTR( dialog );
510#endif 510#endif
511 int result = dialog->exec(); 511 int result = dialog->exec();
512 delete dialog; 512 delete dialog;
513 513
514 if( parent ) parent->erase(); 514 if( parent ) parent->erase();
515 515
516#ifndef QT_NO_TRANSLATION 516#ifndef QT_NO_TRANSLATION
517 if( trans ) { 517 if( trans ) {
518 qApp->removeTranslator( trans ); 518 qApp->removeTranslator( trans );
519 delete trans; 519 delete trans;
520 trans = 0; 520 trans = 0;
521 } 521 }
522#endif 522#endif
523 523
524 setenv( "QDM_STARTED", "", true ); 524 setenv( "QDM_STARTED", "", true );
525 525
526 // if( parent ) parent->erase(); 526 // if( parent ) parent->erase();
527 527
528 //-- get all configs going 528 //-- get all configs going
529 Global::restart(); 529 Global::restart();
530 530
531 return result; 531 return result;
532} 532}
533 533
534 534
535#endif //-- QT_QWS_LOGIN 535#endif //-- QT_QWS_LOGIN