DragonFlyBSD Kernel Audit
DF-0597 / connect_test.c
← back to finding ↓ download raw
/* Tiny connect test for ng_pptpgre session hook */
#include <sys/param.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <netgraph.h>

#define NGM_GENERIC_COOKIE 851672668
#define NGM_MKPEER 2
#define NGM_NAME 4
#define NGM_CONNECT 3
#define NGM_RMHOOK 5

int main(int argc, char **argv) {
    int cs, ds;
    char pname[32];
    snprintf(pname, sizeof(pname), "tp%d", getpid());

    if (NgMkSockNode("testctl", &cs, &ds) < 0) {
        perror("NgMkSockNode");
        return 1;
    }

    /* mkpeer pptpgre upper */
    struct { char type[32], ourhook[32], peerhook[32]; } mkp;
    memset(&mkp, 0, sizeof(mkp));
    snprintf(mkp.type, sizeof(mkp.type), "pptpgre");
    snprintf(mkp.ourhook, sizeof(mkp.ourhook), "dl1");
    snprintf(mkp.peerhook, sizeof(mkp.peerhook), "upper");
    if (NgSendMsg(cs, ".", NGM_GENERIC_COOKIE, NGM_MKPEER, &mkp, sizeof(mkp)) < 0) {
        fprintf(stderr, "mkpeer pptpgre: %s\n", strerror(errno));
        return 1;
    }
    fprintf(stderr, "mkpeer OK\n");

    /* name .:dl1 -> pname */
    struct { char name[32]; } nm;
    memset(&nm, 0, sizeof(nm));
    snprintf(nm.name, sizeof(nm.name), "%s", pname);
    if (NgSendMsg(cs, ".:dl1", NGM_GENERIC_COOKIE, NGM_NAME, &nm, sizeof(nm)) < 0) {
        fprintf(stderr, "name: %s\n", strerror(errno));
        return 1;
    }
    fprintf(stderr, "name OK -> %s\n", pname);

    /* ksocket lower */
    memset(&mkp, 0, sizeof(mkp));
    snprintf(mkp.type, sizeof(mkp.type), "ksocket");
    snprintf(mkp.ourhook, sizeof(mkp.ourhook), "lower");
    snprintf(mkp.peerhook, sizeof(mkp.peerhook), "inet/raw/gre");
    char ppath[64];
    snprintf(ppath, sizeof(ppath), "%s:", pname);
    if (NgSendMsg(cs, ppath, NGM_GENERIC_COOKIE, NGM_MKPEER, &mkp, sizeof(mkp)) < 0) {
        fprintf(stderr, "mkpeer ksocket: %s\n", strerror(errno));
        return 1;
    }
    fprintf(stderr, "ksocket lower OK\n");

    /* now connect: my socket dl_sess <-> p1:session_0001 */
    struct { char path[512], ourhook[32], peerhook[32]; } con;
    memset(&con, 0, sizeof(con));
    snprintf(con.path, sizeof(con.path), "%s", ppath);
    snprintf(con.ourhook, sizeof(con.ourhook), "dl_sess");
    snprintf(con.peerhook, sizeof(con.peerhook), "session_0001");
    if (NgSendMsg(cs, ".", NGM_GENERIC_COOKIE, NGM_CONNECT, &con, sizeof(con)) < 0) {
        fprintf(stderr, "connect session_0001: %s (errno=%d)\n", strerror(errno), errno);
        return 1;
    }
    fprintf(stderr, "connect session_0001 OK\n");
    return 0;
}