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; }