LINUX.ORG.RU

Через XDM не перезапускается а от рута всё пучком :(


0

0

Странно моя прога перезапукается только если она запущена от рута, 
а если её запуск прописан через XDM, т.е. скрипт и конфигурационный файл, 
у меня Джента и как следствие правил /etc/init.d/xdm и rc.conf. 
При запуске через xdm при повторном запуске вылетает сообщение об ошибке 
от стартового крипта о том что не может запустить десктоп менеджер. 
А от рута, как уже сказал, всё пучком. Вот код.


#include "ldm.h"
#include <sys/wait.h>

size_t get_executable_path ( char* buffer, size_t len )
{
	char* path_end;

	if ( readlink ("/proc/self/exe", buffer, len ) <= 0 )
		return -1;

	path_end = strrchr ( buffer, '/' );
	if ( path_end == NULL )
		return -1;

	++path_end;
	*path_end = '\0';

	return ( size_t ) ( path_end - buffer );
}

void go_to_cur_dir ( )
{
	char path[PATH_MAX];
	get_executable_path (path, sizeof (path));
	chdir ( path );
}

void set_root ( )
{
	passwd *pw= getpwnam ( "root" );
	
	setuid( pw->pw_uid );
	setgid( pw->pw_gid );
	setenv ( "HOME", pw->pw_dir, 1 );
	setenv ( "USER", pw->pw_name, 1 );
	setenv ( "LOGUSER", pw->pw_name, 1 );
}

int main ( int argc, char **argv )
{
	int ret;
	set_root ( );
	go_to_cur_dir ( );
	if ( !getenv ( "LDM_POWER" ) )
	{
		if ( !getenv ( "DISPLAY" ) )
		{
			pid_t pid = fork ( );
			if ( pid == 0 ) //1
			{
				pid_t pid = fork ( );
				if ( pid == 0 )//2
				{
					while ( 1 )
					{
						pid_t pid = fork ( );
						if ( pid == 0 )//3
						{
							set_root ( );
							go_to_cur_dir ( );
							if ( getenv ( "LDM_POWER" ) )
							{
								break;
							}
							execlp ( XINIT, XINIT, LDM, 0 );
							perror ( XINIT );
						}
						else if ( pid != -1 )//3
						{
							int status = 0;
							waitpid( pid, &status, 0 );
						}
					}
				}
			}
		}
		else
		{
			QApplication app ( argc, argv );
			ldm *login = new ldm;
			app.setMainWidget ( login );
			login->show ( );
			ret = app.exec ( );
		}
	}
	return ret;
}

Может кто подскажет, что вызывает такое явление.

Заранее спасибо!!!
★★★★★
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.