+int afm_launch(struct afm_launch_desc *desc, pid_t children[2])
+{
+ char datadir[PATH_MAX];
+ int ikl, nkl, rc;
+ char secret[9];
+ struct launchparam params;
+
+ /* what launcher ? */
+ ikl = 0;
+ if (desc->type != NULL && *desc->type) {
+ nkl = sizeof known_launchers / sizeof * known_launchers;
+ while (ikl < nkl && strcmp(desc->type, known_launchers[ikl].type))
+ ikl++;
+ if (ikl == nkl) {
+ ERROR("type %s not found!", desc->type);
+ errno = ENOENT;
+ return -1;
+ }
+ }
+
+ /* prepare paths */
+ rc = snprintf(datadir, sizeof datadir, "%s/%s", desc->home, desc->tag);
+ if (rc < 0 || rc >= sizeof datadir) {
+ ERROR("overflow for datadir");
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* make the secret and port */
+ mksecret(secret);
+ params.port = mkport();
+ params.secret = secret;
+ params.datadir = datadir;
+ params.master_args = known_launchers[ikl].master_args;
+ params.slave_args = known_launchers[ikl].slave_args;
+
+ return params.slave_args ? launchexec2(desc, children, ¶ms) : launchexec1(desc, children, ¶ms);
+}
+