2016-06-01 4 views
0

Mon but est de créer un concept pour les démons qui interagissent localement (pas via le réseau) avec d'autres processus, tous avec des ID/droits d'utilisateur différents.Comment transférer un fichier sur un tube nommé

Pour restreindre l'accès aux daemons aux processus avec les niveaux d'accès à droite, je throught du concept suivant:

  • Chaque démon ouvre un tube nommé pour la lecture dans /foo/{daemon-name}
  • L'accès à ce tube nommé peut être facilement géré via les droits d'accès aux fichiers normaux, donc les autres processus qui ne sont pas dans le bon groupe d'utilisateurs n'auront pas d'accès en écriture
  • changer les droits d'accès au démon plus tard est facile à faire sans avoir besoin de recompiler
  • un processus qui veut communiquer avec le démon envoie une extrémité d'un socketpair() via le canal nommé et la communication continue sur ce lien

De cette façon, chaque Dameon pourrait mettre en œuvre leur propre format API ou un paquet de communiquer via le socketpair . Mais il n'y aurait pas besoin d'authentification et de ce genre parce que les droits d'accès au canal nommé ne prenaient déjà en charge qu'un groupe spécifique capable d'envoyer le socketpair pour communiquer.

Maintenant le seul problème que j'ai est que je ne peux pas obtenir le transfert du descritor de dossier de socketpair() pour fonctionner au-dessus du tuyau nommé. sendmsg() apparemment ne fonctionne pas sur les tuyaux nommés.

Comment puis-je envoyer l'un des socketpair() fds via le canal nommé afin que le démon puisse accéder à la connexion et commencer à communiquer?

+0

Vous pouvez transférer des descripteurs de fichiers sur des sockets, mais je ne pense pas qu'il soit possible de le faire en utilisant un tube nommé. Pensez à utiliser un socket pour communiquer avec votre Dæmon. – fuz

Répondre

1

Un canal nommé ne fonctionnera pas pour ce que vous voulez faire - le canal ne conserve aucune information concernant l'origine des données qu'il contient. C'est un tuyau pour les bits de données brutes, pas une connexion comme une socket qui conserve beaucoup plus d'informations sur l'origine des données et où elle va.

Les sockets de domaine Unix et les canaux nommés ne sont pas identiques - ils ont des capacités différentes. Sockets Unix-domaine peuvent être utilisés pour envoyer des descripteurs de fichiers entre les processus, les tubes nommés ne peuvent pas. Pourquoi ils ont été mis en œuvre de cette façon est une autre question.

Étant donné que vous essayez de créer une connexion socket entre vos processus démon et client, utilisez simplement les sockets Unix-domain pour obtenir directement une telle connexion. Les autorisations du système de fichiers fonctionnent avec les sockets de domaine Unix, tout comme elles le font pour les canaux nommés.