/*
* This file is part of attach-p-cmd strace test.
*
- * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
+ * Copyright (c) 2016-2017 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
+#include "attach-p-cmd.h"
-int
-main(void)
+static void
+write_pidfile(const pid_t pid)
+{
+ FILE *fp = fopen(pidfile, "w");
+ if (!fp)
+ perror_msg_and_fail("fopen: %s", pidfile);
+
+ if (fprintf(fp, "%d", pid) < 0)
+ perror_msg_and_fail("fprintf: %s", pidfile);
+
+ if (fclose(fp))
+ perror_msg_and_fail("fclose: %s", pidfile);
+}
+
+static void
+wait_for_peer_invocation(void)
{
- static const char lockdir[] = "attach-p-cmd.test-lock";
/* wait for the lock directory to be created by peer */
while (rmdir(lockdir)) {
if (ENOENT != errno)
perror_msg_and_fail("rmdir: %s", lockdir);
}
+}
+
+int
+main(void)
+{
+ const pid_t pid = getpid();
+ write_pidfile(pid);
+
+ wait_for_peer_invocation();
static const char dir[] = "attach-p-cmd.test cmd";
- pid_t pid = getpid();
int rc = chdir(dir);
printf("%-5d chdir(\"%s\") = %s\n"
/*
* This file is part of attach-p-cmd strace test.
*
- * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
+ * Copyright (c) 2016-2017 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
+#include <time.h>
#include <unistd.h>
+#include "attach-p-cmd.h"
static void
-handler(int signo)
+wait_for_peer_invocation(void)
{
-}
-
-int
-main(void)
-{
- const struct sigaction act = { .sa_handler = handler };
- if (sigaction(SIGALRM, &act, NULL))
- perror_msg_and_fail("sigaction");
-
- sigset_t mask = {};
- sigaddset(&mask, SIGALRM);
- if (sigprocmask(SIG_UNBLOCK, &mask, NULL))
- perror_msg_and_fail("sigprocmask");
-
- static const char lockdir[] = "attach-p-cmd.test-lock";
- /* create a lock directory */
+ /* create the lock directory */
if (mkdir(lockdir, 0700))
perror_msg_and_fail("mkdir: %s", lockdir);
perror_msg_and_fail("mkdir: %s", lockdir);
}
- /* remove the lock directory */
+ /* cleanup the lock directory */
if (rmdir(lockdir))
perror_msg_and_fail("rmdir: %s", lockdir);
+}
+
+static void
+wait_for_peer_termination(void)
+{
+ FILE *fp = fopen(pidfile, "r");
+ if (!fp)
+ perror_msg_and_fail("fopen: %s", pidfile);
+
+ pid_t pid;
+ if (fscanf(fp, "%d", &pid) < 0)
+ perror_msg_and_fail("fscanf: %s", pidfile);
+ if (pid < 0)
+ error_msg_and_fail("pid = %d", pid);
+
+ if (fclose(fp))
+ perror_msg_and_fail("fclose: %s", pidfile);
+
+ if (unlink(pidfile))
+ perror_msg_and_fail("unlink: %s", pidfile);
+
+ while (kill(pid, 0) == 0)
+ ;
+}
+
+int
+main(void)
+{
+ wait_for_peer_invocation();
+ wait_for_peer_termination();
- alarm(1);
- pause();
+ static const struct timespec ts = { .tv_nsec = 123456789 };
+ if (nanosleep(&ts, NULL))
+ perror_msg_and_fail("nanosleep");
static const char dir[] = "attach-p-cmd.test -p";
pid_t pid = getpid();
int rc = chdir(dir);
- printf("%-5d --- SIGALRM {si_signo=SIGALRM, si_code=SI_KERNEL} ---\n"
- "%-5d chdir(\"%s\") = %d %s (%m)\n"
+ printf("%-5d chdir(\"%s\") = %s\n"
"%-5d +++ exited with 0 +++\n",
- pid, pid, dir, rc, errno2name(), pid);
+ pid, dir, sprintrc(rc), pid);
return 0;
}