1 /*
2  * Copyright (c) 2006-2012 Los Alamos National Security, LLC.  All rights
3  *                         reserved.
4  * Copyright (c) 2007      Cisco Systems, Inc.  All rights reserved.
5  * Copyright (c) 2010      Sandia National Laboratories. All rights reserved.
6  * Copyright (c) 2015      Research Organization for Information Science
7  *                         and Technology (RIST). All rights reserved.
8  * Copyright (c) 2016-2020 Intel, Inc.  All rights reserved.
9  * $COPYRIGHT$
10  *
11  * Additional copyrights may follow
12  *
13  * $HEADER$
14  *
15  */
16 
17 #include "src/include/pmix_config.h"
18 
19 #include "include/pmix_common.h"
20 #include "src/mca/mca.h"
21 #include "src/mca/pinstalldirs/pinstalldirs.h"
22 #include "src/mca/pinstalldirs/base/base.h"
23 #include "src/mca/pinstalldirs/base/static-components.h"
24 
25 pmix_pinstall_dirs_t pmix_pinstall_dirs = {0};
26 
27 #define CONDITIONAL_COPY(target, origin, field)                 \
28     do {                                                        \
29         if (origin.field != NULL && target.field == NULL) {     \
30             target.field = origin.field;                        \
31         }                                                       \
32     } while (0)
33 
34 static int
pmix_pinstalldirs_base_open(pmix_mca_base_open_flag_t flags)35 pmix_pinstalldirs_base_open(pmix_mca_base_open_flag_t flags)
36 {
37     return pmix_mca_base_framework_components_open(&pmix_pinstalldirs_base_framework, flags);
38 }
39 
pmix_pinstall_dirs_base_init(pmix_info_t info[],size_t ninfo)40 int pmix_pinstall_dirs_base_init(pmix_info_t info[], size_t ninfo)
41 {
42     pmix_mca_base_component_list_item_t *component_item;
43 
44     PMIX_LIST_FOREACH(component_item, &pmix_pinstalldirs_base_framework.framework_components, pmix_mca_base_component_list_item_t) {
45         const pmix_pinstalldirs_base_component_t *component =
46             (const pmix_pinstalldirs_base_component_t *) component_item->cli_component;
47 
48         if (NULL != component->init) {
49             component->init(info, ninfo);
50         }
51 
52         /* copy over the data, if something isn't already there */
53         CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
54                          prefix);
55         CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
56                          exec_prefix);
57         CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
58                          bindir);
59         CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
60                          sbindir);
61         CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
62                          libexecdir);
63         CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
64                          datarootdir);
65         CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
66                          datadir);
67         CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
68                          sysconfdir);
69         CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
70                          sharedstatedir);
71         CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
72                          localstatedir);
73         CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
74                          libdir);
75         CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
76                          includedir);
77         CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
78                          infodir);
79         CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
80                          mandir);
81         CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
82                          pmixdatadir);
83         CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
84                          pmixlibdir);
85         CONDITIONAL_COPY(pmix_pinstall_dirs, component->install_dirs_data,
86                          pmixincludedir);
87     }
88 
89     /* expand out all the fields */
90     pmix_pinstall_dirs.prefix =
91         pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.prefix);
92     pmix_pinstall_dirs.exec_prefix =
93         pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.exec_prefix);
94     pmix_pinstall_dirs.bindir =
95         pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.bindir);
96     pmix_pinstall_dirs.sbindir =
97         pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.sbindir);
98     pmix_pinstall_dirs.libexecdir =
99         pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.libexecdir);
100     pmix_pinstall_dirs.datarootdir =
101         pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.datarootdir);
102     pmix_pinstall_dirs.datadir =
103         pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.datadir);
104     pmix_pinstall_dirs.sysconfdir =
105         pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.sysconfdir);
106     pmix_pinstall_dirs.sharedstatedir =
107         pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.sharedstatedir);
108     pmix_pinstall_dirs.localstatedir =
109         pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.localstatedir);
110     pmix_pinstall_dirs.libdir =
111         pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.libdir);
112     pmix_pinstall_dirs.includedir =
113         pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.includedir);
114     pmix_pinstall_dirs.infodir =
115         pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.infodir);
116     pmix_pinstall_dirs.mandir =
117         pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.mandir);
118     pmix_pinstall_dirs.pmixdatadir =
119         pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.pmixdatadir);
120     pmix_pinstall_dirs.pmixlibdir =
121         pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.pmixlibdir);
122     pmix_pinstall_dirs.pmixincludedir =
123         pmix_pinstall_dirs_expand_setup(pmix_pinstall_dirs.pmixincludedir);
124 
125 #if 0
126     fprintf(stderr, "prefix:         %s\n", pmix_pinstall_dirs.prefix);
127     fprintf(stderr, "exec_prefix:    %s\n", pmix_pinstall_dirs.exec_prefix);
128     fprintf(stderr, "bindir:         %s\n", pmix_pinstall_dirs.bindir);
129     fprintf(stderr, "sbindir:        %s\n", pmix_pinstall_dirs.sbindir);
130     fprintf(stderr, "libexecdir:     %s\n", pmix_pinstall_dirs.libexecdir);
131     fprintf(stderr, "datarootdir:    %s\n", pmix_pinstall_dirs.datarootdir);
132     fprintf(stderr, "datadir:        %s\n", pmix_pinstall_dirs.datadir);
133     fprintf(stderr, "sysconfdir:     %s\n", pmix_pinstall_dirs.sysconfdir);
134     fprintf(stderr, "sharedstatedir: %s\n", pmix_pinstall_dirs.sharedstatedir);
135     fprintf(stderr, "localstatedir:  %s\n", pmix_pinstall_dirs.localstatedir);
136     fprintf(stderr, "libdir:         %s\n", pmix_pinstall_dirs.libdir);
137     fprintf(stderr, "includedir:     %s\n", pmix_pinstall_dirs.includedir);
138     fprintf(stderr, "infodir:        %s\n", pmix_pinstall_dirs.infodir);
139     fprintf(stderr, "mandir:         %s\n", pmix_pinstall_dirs.mandir);
140     fprintf(stderr, "pkgdatadir:     %s\n", pmix_pinstall_dirs.pkgdatadir);
141     fprintf(stderr, "pkglibdir:      %s\n", pmix_pinstall_dirs.pkglibdir);
142     fprintf(stderr, "pkgincludedir:  %s\n", pmix_pinstall_dirs.pkgincludedir);
143 #endif
144 
145     /* NTH: Is it ok not to close the components? If not we can add a flag
146        to mca_base_framework_components_close to indicate not to deregister
147        variable groups */
148     return PMIX_SUCCESS;
149 }
150 
151 
152 static int
pmix_pinstalldirs_base_close(void)153 pmix_pinstalldirs_base_close(void)
154 {
155     free(pmix_pinstall_dirs.prefix);
156     free(pmix_pinstall_dirs.exec_prefix);
157     free(pmix_pinstall_dirs.bindir);
158     free(pmix_pinstall_dirs.sbindir);
159     free(pmix_pinstall_dirs.libexecdir);
160     free(pmix_pinstall_dirs.datarootdir);
161     free(pmix_pinstall_dirs.datadir);
162     free(pmix_pinstall_dirs.sysconfdir);
163     free(pmix_pinstall_dirs.sharedstatedir);
164     free(pmix_pinstall_dirs.localstatedir);
165     free(pmix_pinstall_dirs.libdir);
166     free(pmix_pinstall_dirs.includedir);
167     free(pmix_pinstall_dirs.infodir);
168     free(pmix_pinstall_dirs.mandir);
169     free(pmix_pinstall_dirs.pmixdatadir);
170     free(pmix_pinstall_dirs.pmixlibdir);
171     free(pmix_pinstall_dirs.pmixincludedir);
172     memset (&pmix_pinstall_dirs, 0, sizeof (pmix_pinstall_dirs));
173 
174     return pmix_mca_base_framework_components_close (&pmix_pinstalldirs_base_framework, NULL);
175 }
176 
177 /* Declare the pinstalldirs framework */
178 PMIX_MCA_BASE_FRAMEWORK_DECLARE(pmix, pinstalldirs, NULL, NULL, pmix_pinstalldirs_base_open,
179                                 pmix_pinstalldirs_base_close, mca_pinstalldirs_base_static_components,
180                                 PMIX_MCA_BASE_FRAMEWORK_FLAG_NOREGISTER | PMIX_MCA_BASE_FRAMEWORK_FLAG_NO_DSO);
181