/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
Hvordan laves en wrapper til et program?
Fra : Kenneth Ahn Jensen


Dato : 13-12-02 23:07

I forbindelse med et projekt på skolen er jeg stødt på et lille problem med
et program, som jeg skal have kørt fra en Java VM. Problemet består i at
jeg ikke kan få at vide, hvordan den Java klasse (som er min grænseflade
til programmet, der er en binær eksekverbar fætter skrevet i Haskell) tager
argumenter med til programmet.

Derfor vil jeg gerne lave et lillebitte C program, som starter det rigtige
program men samtidig giver det et prædefineret argument med. Jeg har fusket
noget sammen her, som næsten virker:
---
#include <stdio.h>
#include <strings.h>
#include <errno.h>
#include <unistd.h>

#define QUIPEXE "/usr/local/bin/quip"
#define QUIPHOME "-home /tmp/xmlbibdata/data"
#define QUIPUNWRAP "-unwrapped_result"

int main(int argc, char *argv[], char *envp[]) {
execve( QUIPEXE, argv, envp );
}
---
Dette starter /usr/local/bin/quip med samme argumenter som jeg giver med fra
shell'en, så mangler jeg bare at knalde QUIPHOME og QUIPUNWRAP ind som de
første argumenter.

Kan nogen hjælpe mig med det?

Jeg ville gerne gøre det selv, men jeg har aldrig skrevet andet end Hello.c,
og kan heller ikke overskue at begrave mig (yderligere) i man siderne for
execv-familien af systemkald...

--
Mvh
Kenneth


PS: Hvis det er uklart hvad jeg vil, så :
Hvis det var et Java program ville jeg lave en ny char[] newargv, og
indsætte mine argumenter først, derefter fylde efter med indholdet af
argv[], derefter argv[]=newargv[] og så køre videre...

Alternativt kunne jeg lave et alias quipp='/usr/local/bin/quip
-unwrapped_result -home /tmp/xmlbibdata/data' og bruge den som jeg ellers
ville bruge quip programmet normalt, men nu skal jeg eksekvere det fra et
program og ikke fra shell'en, så jeg er lidt fortabt...

 
 
Alex Holst (13-12-2002)
Kommentar
Fra : Alex Holst


Dato : 13-12-02 23:47

Kenneth Ahn Jensen <antipiratgruppen@removeyahoo.com> wrote:
> Derfor vil jeg gerne lave et lillebitte C program, som starter det rigtige
> program men samtidig giver det et prædefineret argument med. Jeg har fusket
> noget sammen her, som næsten virker:

Medmindre du har brug for at koere wrapperen som SUID eller SGID kan du
blot skrive et shell script. (eller perl eller hvilket som helst andet
sprog).

--
I prefer the dark of the night, after midnight and before four-thirty,
when it's more bare, more hollow. http://a.mongers.org

Byrial Jensen (14-12-2002)
Kommentar
Fra : Byrial Jensen


Dato : 14-12-02 00:43

Kenneth Ahn Jensen <antipiratgruppen@REMOVEyahoo.com> skrev:
> Derfor vil jeg gerne lave et lillebitte C program, som starter det rigtige
> program men samtidig giver det et prædefineret argument med. Jeg har fusket
> noget sammen her, som næsten virker:

Prøv med:

#include <stdlib.h> // for malloc ()
#include <stddef.h> // for NULL
#include <unistd.h> // for execv ()

#define QUIPEXE "/usr/local/bin/quip"
#define QUIPHOME1 "-home"
#define QUIPHOME2 "/tmp/xmlbibdata/data"
#define QUIPUNWRAP "-unwrapped_result"

int main (int argc, char *argv[])
{
// Vi skal have et nyt array af strengpointere med plads til 3 flere
// elementer end argv har (argv har argc + 1 elementer).
char **new_argv = malloc (sizeof (char *) * (argc + 1 + 3));
if (new_argv == NULL)
return -1; // Ikke nok hukommelse

new_argv[0] = QUIPEXE; // Det kaldte programs navn ligger i argv[0]
new_argv[1] = QUIPHOME1;
new_argv[2] = QUIPHOME2;
new_argv[3] = QUIPUNWRAP;

// kopier de resterende elementer fra argv til new_argv
for (int i = 1 ; i <= argc ; ++ i)
new_argv[i + 3] = argv[i];

// Skift program, Det nye program arver dette programs miljøvariabler
return execv (QUIPEXE, new_argv); // execv () returnerer -1 ved fejl
}

Søg
Reklame
Statistik
Spørgsmål : 177508
Tips : 31968
Nyheder : 719565
Indlæg : 6408576
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste