[OT] jak odpalić thunderbirda?

Tomek Grzejszczyk T.Grzejszczyk w elka.pw.edu.pl
Pią, 4 Cze 2004, 09:27:47 CEST


Cześć,
List jest może trochę OT, w razie czego proszę o skierowanie mnie na 
właściwą listę.

Problem jest taki, że usiłuję zainstalować sobie dockappa wmmaiload, nie 
ma go na razie w PLD więc kompiluję go ze źródeł (może napiszę speca, 
jak go już zmuszę do działąnia, tak w ramach podziękowań). Posiada on 
taką funkcjonalność, że po kliknięciu myszką odpala dowolny program, w 
moim przypadku mozilla-thunderbird. Robi to w ten sposób:

wywołuje funkcję my_system("mozilla-thunderbird",NULL)

static int my_system(char *cmd, char *param) {
     int           pid;
     extern char **environ;

     if (cmd == 0) return 1;
     pid = fork();
     if (pid == -1) return -1;
     if (pid == 0) {
         pid = fork();
         if (pid == 0) {
             char *argv[4];
             char fcmd[2048];
             strncpy(fcmd, cmd, 2047);
             if (param) strncat(fcmd, param, 2045 - strlen(cmd));
             argv[0] = "sh";
             argv[1] = "-c";
             argv[2] = fcmd;
             argv[3] = 0;
             execve("/bin/sh", argv, environ);
             exit(0);
         }
         exit(0);
     }
     return 0;
}

Ta funkcja robi w miarę oczywistą rzecz (jeśli nie brać pod uwagę 
drugiego fork() nie wiadomo po co), tylko że thunderbird odpalony w ten 
sposób wywala się w 9 przypadkach na 10. Wyświetla "Memory fault" zanim 
jeszcze odpali się interfejs graficzny.

Jest to dziwne biorąc pod uwagę następujące fakty:
- odpalony z ręki nie wywala się nigdy
- odpalony z innego dockappa (wmdrawer), nie wywala się nigdy
- jeśli zamiast thunderbirda odpalę coś innego z wmmaiload (gvima) to 
nie wywala się

Thunderbirda zbudowałem ze speca i ostatnio uaktualniłem biblioteki, 
więc może to dlatego, ale czemu tylko z jednego dockappa?

Sprawdziłem jak odpalanie aplikacji jest robione w wmdrawer, jest tam 
bardzo podobna funkcja:

void execCmd (const char *cmd) {
   int cpid;

   cpid = fork ();
   if (cpid == -1) {
     printf ("%s error: can't fork\n", PACKAGE);
   }
   else if (cpid == 0) {
     setsid ();
     execl ("/bin/sh", "/bin/sh", "-c", cmd, NULL);
     exit (EXIT_SUCCESS);
   }
}

Różnica polega w zasadzie tylko na wywołaniu setsid. No ale, może czegoś 
nie wiem. W każdym razie przepisałem ten kod do wmmaiload (tak żeby 
pasowało), ale nic to nie zmieniło, nadal nie lubi thunderbirda. W tej 
chwili zabrakło mi już pomysłów jak mogę to dalej debugować i próbować 
naprawić. Będę wdzięczy za pomoc.

Tomek Grzejszczyk



Więcej informacji o liście dyskusyjnej pld-devel-pl