#include #include #include #include void _droppriv(char *user, int do_chroot, char *chroot_path) { struct passwd *pw; pw = getpwnam(user); if (!pw) err(1, "unknown user %s", user); if (do_chroot) { if (!chroot_path) chroot_path = pw->pw_dir; if (chroot(chroot_path) != 0) err(1, "unable to chroot"); } if (chdir("/") != 0) err(1, "unable to chdir"); if (setgroups(1, &pw->pw_gid) == -1) err(1, "setgroups() failed"); if (setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) == -1) err(1, "setresgid failed"); if (setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid) == -1) err(1, "setresuid() failed"); endpwent(); } int main(int argc, char **argv) { intf_t *intf; struct addr dst; struct intf_entry entry; int err; if (argc != 2) { printf("usage: %s \n", argv[0]); return 1; } addr_aton(argv[1], &dst); printf("dst: %s\n", addr_ntoa(&dst)); _droppriv("nobody", 1, NULL); /* bad practise, use dedicated user */ intf = intf_open(); err = intf_get_dst(intf, &entry, &dst); if (err < 0) { printf("intf_get_dst error !\n"); return 2; } printf("entry:\n"); printf(" intf_name: %s\n", entry.intf_name); printf(" intf_addr: %s\n", addr_ntoa(&entry.intf_addr)); printf(" intf_link_addr: %s\n", addr_ntoa(&entry.intf_link_addr)); return 0; }