- replacing fork with exec
[oweals/gnunet.git] / src / testbed / gnunet_mpi_test.c
1 #include "platform.h"
2 #include "gnunet_util_lib.h"
3 #include <mpi.h>
4
5 /**
6  * Generic logging shorthand
7  */
8 #define LOG(kind,...)                                           \
9   GNUNET_log_from (kind, "gnunet-mpi-test", __VA_ARGS__)
10
11 int main (int argc, char *argv[])
12 {
13   char *msg;
14   char *filename;
15   struct GNUNET_OS_Process *proc;
16   unsigned long code;
17   pid_t pid;
18   enum GNUNET_OS_ProcessStatusType proc_status;
19   int ntasks;
20   int rank;
21   int msg_size;
22   int ret;
23
24   ret = GNUNET_SYSERR;
25   if (MPI_SUCCESS != MPI_Init (&argc, &argv))
26   {
27     GNUNET_break (0);
28     return 1;
29   }
30   if (MPI_SUCCESS != MPI_Comm_size (MPI_COMM_WORLD, &ntasks))
31   {
32     GNUNET_break (0);
33     goto finalize;
34   }
35   if (MPI_SUCCESS != MPI_Comm_rank (MPI_COMM_WORLD, &rank))
36   {
37     GNUNET_break (0);
38     goto finalize;
39   }
40   pid = getpid();
41   (void) GNUNET_asprintf (&filename, "%d-%d.mpiout", (int) pid, rank);
42   msg_size = GNUNET_asprintf (&msg, "My rank is: %d\n", rank);
43   printf ("%s", msg);
44   if (msg_size == GNUNET_DISK_fn_write (filename,
45                                         msg, msg_size,
46                                         GNUNET_DISK_PERM_USER_READ
47                                         | GNUNET_DISK_PERM_GROUP_READ
48                                         | GNUNET_DISK_PERM_USER_WRITE
49                                         | GNUNET_DISK_PERM_GROUP_WRITE))
50     ret = GNUNET_OK;
51   GNUNET_free (filename);
52   GNUNET_free (msg);
53   if (GNUNET_OK != ret)
54   {
55     GNUNET_break (0);
56     goto finalize;
57   }
58
59   ret = GNUNET_SYSERR;
60   proc = GNUNET_OS_start_process (GNUNET_NO,
61                                   GNUNET_OS_INHERIT_STD_ALL,
62                                   NULL,
63                                   NULL,
64                                   "uptime", NULL);
65   if (NULL == proc)
66   {
67     printf ("Cannot exec\n");
68     goto finalize;
69   }
70   do {
71     (void) sleep (1);
72     ret = GNUNET_OS_process_status (proc, &proc_status, &code);
73   } while (GNUNET_NO == ret);
74   GNUNET_assert (GNUNET_NO != ret);
75   if (GNUNET_OK == ret)
76   {
77     if (0 != code)
78     {
79       LOG (GNUNET_ERROR_TYPE_WARNING, "Child terminated abnormally\n");
80       ret = GNUNET_SYSERR;
81       GNUNET_break (0);
82       goto finalize;
83     }
84   }
85   else
86     GNUNET_break (0);
87
88  finalize:
89   (void) MPI_Finalize ();
90   if (GNUNET_OK == ret)
91     return 0;
92   printf ("Something went wrong\n");
93   return 1;
94 }