The portmapper object has a dereg
()
method that undoes
a reg
() - deregisters a specific port or ports with
the portmapper daemon, while keeping any other registered ports.
reg
(), dereg
(), and
connect
() methods also take an additional optional
parameter, a
terminator file descriptor. If the
terminator file descriptor becomes readable, an exception gets thrown,
and the connection to the portmapper daemon is closed, all registered
ports get deregistered.
On Linux, the
/proc/
symlink gives the
name of the executable that started the process.
On Linux, reading a process's executable pathname succeeds
only if both processes have the same userid.
The portmapper provides a way for cooperating processes to make
their executable's name visible to other processes.
pid
/exe
The third parameter
to reg()
is a set of bitwise-or flags one of which
is x::httportmap::base::pm_public
. If set, the
process's executable pathname gets included as part of the registered
service.
A low-level portmapper method, list
(), returns a list
of services registered with the portmapper, include the executable
pathname, if made public.
This is the low-level approach. The high level approach uses
regpid2exe
():
#include <x/httportmap.H> x::httportmap portmapper(x::httportmap::create()); portmapper->regpid2exe(); // ... pid_t pid; // ... std::string path=portmapper->pid2exe(pid);
regpid2exe
() advertises this process's executable
pathname through the portmapper. pid2exe
() returns
another process's executable pathname, if the other process
called regpid2exe
() previously. An empty string gets
returned if the process could not be found, or did not call
regpid2exe
().
There's also a deregpid2exe
() that deregisters the
reserved service that announces the executable pathname.
Like other portmapper methods, these three functions also take an optional
timeout file descriptor parameter; although that since they always connect
to a portmapper instance running on the same machine, the timeout file
descriptor offers little practical purpose.
regpid2exe
() counts towards the limit on the
maximum number of registered services, with the portmapper,
from the same process.
Advertised executable pathnames are considered to be supplementary metadata, and should not be exclusively relied upon, for authentication. For example, after reading an executable's process id, the original process can fork, with the parent exiting, and subsequently the process id gets recycled for another process. When a process creates a connection with the portmapper, if the portmapper has a registered entry ostensibly from the same process id, but a different executable name, the portmapper removes the other process's executable name.
Announcing and advertising a pathname provides a means for identifying and connecting to applications. In situations that involve some kind of authentication, it should be done by other means, like sending userid/groupid credentials over filesystem domain sockets.
If a process's executable binary gets deleted, but the process still runs, its executable pathname no longer exists. Long-running server daemons should connect to the portmapper and advertise their pathname promptly after starting, on systems that use prelink, which tends to overwrite binaries, periodically.