Le lanceur pourrait ressembler à ça: (à compiler avec -std=c99 -ldl -o run-with-cap-net-bind-service)
#include <dlfcn.h>
typedef int (*FuncPtr)(/* ... */);
int main(int argc, char *argv[])
{
const char *libpath = ...; /* à récupérer dans argv */
void *lib = dlopen(libpath);
if (lib == NULL)
abort();
FuncPtr libmain = (FuncPtr)dlsym(lib, "libmain");
if (libmain == NULL)
abort();
return libmain(/* ... *);
}
Ce programme reçoit la capabilitycap_net_bind_service et éventuellement quelques restrictions (chgrp, chmod g+x, ...).
L'utilisateur crée son code et le compile avec l'option -shared.
Ex: gcc -shared ... -o libmain.so
NB: le point d'entrée devient:
int libmain(/* même signature que ci-dessus, cf. FuncPtr */)
{
}
Pour lancer le tout: ./run-with-cap-net-bind-service libmain.so ...
# Décomposer exécutable en lanceur + bibliothèque
Posté par Achille Fouilleul . En réponse au message POSIX capabilities / ouvrir port tcp <=1024. Évalué à 2.
Une idée que je n'ai pas testée.
Le lanceur pourrait ressembler à ça: (à compiler avec -std=c99 -ldl -o run-with-cap-net-bind-service)
Ce programme reçoit la capability
cap_net_bind_serviceet éventuellement quelques restrictions (chgrp, chmod g+x, ...).L'utilisateur crée son code et le compile avec l'option
-shared.Ex:
gcc -shared ... -o libmain.soNB: le point d'entrée devient:
Pour lancer le tout: ./run-with-cap-net-bind-service libmain.so ...