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

_______________________________________________________
złota zasada - kto się nie zna, niech się nie wypowiada



Odpowiedź listem elektroniczym