digraph G {
    subgraph cluster_authenticate {
        label = "authenticate.c"
        auth_userokay;
        auth_usercheck;
        auth_verify;
    }

    subgraph cluster_auth_subr {
        label = "auth_subr.c"
        auth_open;
        auth_call;
        auth_close;
        // auth_setitem;
        // auth_setdata;
        // auth_setopts;
        auth_set[label="auth_set*"];
        auth_setstate;
        // _auth_spool;
    }

    subgraph cluster_login_cap {
        label = "libc/login_cap.c"
        login_getclass
        login_getstyle
    }

    subgraph cluster_getpwent {
        label = "libc/getpwent.c"
        getpwnam_r;
    }

    subgraph cluster_exec {
        login[label="login_*"];
        execve;
    }


    start -> auth_userokay;
    auth_userokay -> auth_usercheck;
    auth_usercheck -> getpwnam_r;
    auth_usercheck -> login_getclass;
    auth_usercheck -> login_getstyle;
    // if password given
    auth_usercheck -> auth_open;
    // auth_usercheck -> auth_setitem;
    // auth_usercheck -> auth_setdata;
    auth_usercheck -> auth_set;
    // fi
    auth_usercheck -> auth_verify;

    auth_verify -> auth_setstate;
    auth_verify -> auth_call;

    auth_call -> execve[label="fork()"];
    // auth_call -> _auth_spool;

    execve -> login;
    login -> auth_call[label="back channel"];
    // login -> _auth_spool[label="back channel"];


    // auth_usercheck -> { auth_setitem auth_setdata auth_setopts }

    // auth_call -> auth_userokay;
    auth_userokay -> auth_close;
}