Hello all,
I am burning my last neurons with a behavior I can't explain. I wonder
why getaddrinfo() fails when called after chroot() with root user.
I have this piece of code :
/*--- test.c ---*/
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netdb.h>
#include <pwd.h>
int main(int argc, char *argv[])
{
struct addrinfo *ai_out;
struct passwd *pw;
int error;
pw = getpwnam("_bgpd");
error = getaddrinfo("rpki.liopen.eu", NULL, NULL, &ai_out);
if (error)
printf("getaddrinfo() failed\n");
else printf("getaddrinfo() succeed\n");
chroot(pw->pw_dir);
chdir("/");
error = getaddrinfo("rpki.liopen.eu", NULL, NULL, &ai_out);
if (error)
printf("getaddrinfo() failed\n");
else printf("getaddrinfo() succeed\n");
return 0;
}
/*--- test.c ---*/
$ ./a.out
getaddrinfo() succeed
getaddrinfo() succeed
# ./a.out
getaddrinfo() succeed
getaddrinfo() succeed
Everything is good. Now if I compile :
/*--- test.c ---*/
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netdb.h>
#include <pwd.h>
int main(int argc, char *argv[])
{
struct addrinfo *ai_out;
struct passwd *pw;
int error;
pw = getpwnam("_bgpd");
error = 0
if (error)
printf("getaddrinfo() failed\n");
else printf("getaddrinfo() succeed\n");
chroot(pw->pw_dir);
error = getaddrinfo("rpki.liopen.eu", NULL, NULL, &ai_out);
if (error)
printf("getaddrinfo() failed\n");
else printf("getaddrinfo() succeed\n");
return 0;
}
/*--- test.c ---*/
$ ./a.out
getaddrinfo() succeed
getaddrinfo() succeed
# ./a.out
getaddrinfo() succeed
getaddrinfo() failed
If this an expected behavior, what would be the preferred way to resolve
a name from a chrooted process ? I am extending OpenBGPd and I need to
resolve domain names and connect to a service (no BGP protocol). I am
currently using the "session" process to handle the connection part but
I am stuck on name resolution for now.
Thank you in advance,
Denis