I'm trying to implement 'execveat'. Here is what I have so far.
Code:
+int
+linux_execveat(struct thread *td, struct linux_execveat_args *args)
+{
+ struct image_args eargs;
+ char *path;
+ int error, dfd;
+
+ LINUX_CTR(execveat);
+
+ dfd = (args->dfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->dfd;
+
+ if (!LUSECONVPATH(td)) {
+ printf("copyin with path. I don't know. \n");
+ return (EINVAL);
+ }
+ LCONVPATHEXIST_AT(td, args->filename, &path, dfd);
+ printf("lconvpathexist():1; with dfd=%d. with path=%s. LINUX_AT_FDCWD=%d\n", dfd, path, LINUX_AT_FDCWD);
+ printf(" flags = %d || AT_SYMLINK_NOFOLLOW=%d AT_EMPTY_PATH=%d\n",
+ args->flags,
+ args->flags & AT_SYMLINK_NOFOLLOW,
+ args->flags & AT_EMPTY_PATH);
+ eargs.fd = dfd;
+ error = exec_copyin_args(&eargs, path, UIO_SYSSPACE, args->argv,
+ args->envp);
+ eargs.fd = dfd;
+ LFREEPATH(path);
+ // LCONVPATH_AT
+ // LCONVPATHEXIST
+ //
+
+ if (error == 0)
+ error = linux_common_execve(td, &eargs);
+
+ return (error);
+}
+