1 /*
2 * Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
3 * University Research and Technology
4 * Corporation. All rights reserved.
5 * Copyright (c) 2004-2013 The University of Tennessee and The University
6 * of Tennessee Research Foundation. All rights
7 * reserved.
8 * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
9 * University of Stuttgart. All rights reserved.
10 * Copyright (c) 2004-2005 The Regents of the University of California.
11 * All rights reserved.
12 * Copyright (c) 2012-2013 Inria. All rights reserved.
13 * Copyright (c) 2015 Research Organization for Information Science
14 * and Technology (RIST). All rights reserved.
15 * Copyright (c) 2018 IBM Corporation. All rights reserved.
16 * $COPYRIGHT$
17 *
18 * Additional copyrights may follow
19 *
20 * $HEADER$
21 */
22
23 #include "ompi_config.h"
24
25 #include "ompi/mpi/c/bindings.h"
26 #include "ompi/runtime/params.h"
27 #include "ompi/communicator/communicator.h"
28 #include "ompi/errhandler/errhandler.h"
29 #include "ompi/info/info.h"
30 #include "opal/util/show_help.h"
31 #include <stdlib.h>
32 #include <string.h>
33
34 #if OMPI_BUILD_MPI_PROFILING
35 #if OPAL_HAVE_WEAK_SYMBOLS
36 #pragma weak MPI_Info_set = PMPI_Info_set
37 #endif
38 #define MPI_Info_set PMPI_Info_set
39 #endif
40
41 static const char FUNC_NAME[] = "MPI_Info_set";
42
43
44 /**
45 * MPI_Info_set - Set a (key, value) pair in an 'MPI_Info' object
46 *
47 * @param key null-terminated character string of the index key
48 * @param value null-terminated character string of the value
49 * @param info info object (handle)
50 *
51 * @retval MPI_SUCCESS
52 * @retval MPI_ERR_ARG
53 * @retval MPI_ERR_INFO_KEY
54 * @retval MPI_ERR_INFO_VAL
55 * @retval MPI_ERR_INFO_NOKEY
56 * @retval MPI_ERR_NO_MEM
57 *
58 * MPI_Info_set adds the (key,value) pair to info, and overrides
59 * the value if for the same key a previsou value was set. key and
60 * value must be NULL terminated strings in C. In Fortan, leading
61 * and trailing spaces in key and value are stripped. If either
62 * key or value is greater than the allowed maxima, MPI_ERR_INFO_KEY
63 * and MPI_ERR_INFO_VALUE are raised
64 */
65 int MPI_Info_set(MPI_Info info, const char *key, const char *value)
66 {
67 int err;
68 int key_length;
69 int value_length;
70
71 /*
72 * Error conditions are
73 * - info is NULL
74 * - No storage space available for the new value
75 * - Key length exceeded MPI_MAX_KEY_VAL
76 * - value length exceeded MPI_MAX_KEY_VAL
77 */
78
79 if (MPI_PARAM_CHECK) {
80 OMPI_ERR_INIT_FINALIZE(FUNC_NAME);
81 if (NULL == info || MPI_INFO_NULL == info ||
82 ompi_info_is_freed(info)) {
83 return OMPI_ERRHANDLER_INVOKE (MPI_COMM_WORLD, MPI_ERR_INFO,
84 FUNC_NAME);
85 }
86
87 key_length = (key) ? (int)strlen (key) : 0;
88 if ((NULL == key) || (0 == key_length) ||
89 (MPI_MAX_INFO_KEY <= key_length)) {
90 return OMPI_ERRHANDLER_INVOKE (MPI_COMM_WORLD, MPI_ERR_INFO_KEY,
91 FUNC_NAME);
92 }
93
94 value_length = (value) ? (int)strlen (value) : 0;
95 if ((NULL == value) || (0 == value_length) ||
96 (MPI_MAX_INFO_VAL <= value_length)) {
97 return OMPI_ERRHANDLER_INVOKE (MPI_COMM_WORLD, MPI_ERR_INFO_VALUE,
98 FUNC_NAME);
99 }
100 }
101
102 // An extra warning condition is a key that uses our reserved prefix "__IN_".
103 // That one is used internally to deal with the dynamic nature the key/val
104 // pairs where we have callbacks that modify the val, and the MPI standard
105 // wants the get_info call to give back the original setting rather than
106 // the callback-modified setting. So if a user directly used a key __IN_foo
107 // it would confuse our accounting slightly.
108 if (0 == strncmp(key, OPAL_INFO_SAVE_PREFIX, strlen(OPAL_INFO_SAVE_PREFIX))) {
109 opal_show_help("help-mpi-api.txt", "info-set-with-reserved-prefix", true,
110 key, OPAL_INFO_SAVE_PREFIX);
111 }
112
113 OPAL_CR_ENTER_LIBRARY();
114
115 /*
116 * If all is right with the arguments, then call the back-end
117 * allocator.
118 */
119
120 err = ompi_info_set (info, key, value);
121 OMPI_ERRHANDLER_RETURN(err, MPI_COMM_WORLD, err, FUNC_NAME);
122 }