| 924 | } |
| 925 | |
| 926 | static cs_error_t cmap_mcast_send(enum cmap_mcast_reason reason, int argc, char *argv[]) |
| 927 | { |
| 928 | int i; |
| 929 | size_t value_len; |
| 930 | icmap_value_types_t value_type; |
| 931 | cs_error_t err; |
| 932 | size_t item_len; |
| 933 | size_t msg_len = 0; |
| 934 | struct req_exec_cmap_mcast req_exec_cmap_mcast; |
| 935 | struct req_exec_cmap_mcast_item *item = NULL; |
| 936 | struct iovec req_exec_cmap_iovec[MAX_REQ_EXEC_CMAP_MCAST_ITEMS + 1]; |
| 937 | |
| 938 | ENTER(); |
| 939 | |
| 940 | if (argc > MAX_REQ_EXEC_CMAP_MCAST_ITEMS) { |
| 941 | return (CS_ERR_TOO_MANY_GROUPS); |
| 942 | } |
| 943 | |
| 944 | memset(req_exec_cmap_iovec, 0, sizeof(req_exec_cmap_iovec)); |
| 945 | |
| 946 | for (i = 0; i < argc; i++) { |
| 947 | err = icmap_get(argv[i], NULL, &value_len, &value_type); |
| 948 | if (err != CS_OK && err != CS_ERR_NOT_EXIST) { |
| 949 | goto free_mem; |
| 950 | } |
| 951 | if (err == CS_ERR_NOT_EXIST) { |
| 952 | value_type = ICMAP_VALUETYPE_NOT_EXIST; |
| 953 | value_len = 0; |
| 954 | } |
| 955 | |
| 956 | item_len = MAR_ALIGN_UP(sizeof(*item) + value_len, 8); |
| 957 | |
| 958 | item = malloc(item_len); |
| 959 | if (item == NULL) { |
| 960 | goto free_mem; |
| 961 | } |
| 962 | memset(item, 0, item_len); |
| 963 | |
| 964 | item->value_type = value_type; |
| 965 | item->value_len = value_len; |
| 966 | item->key_name.length = strlen(argv[i]); |
| 967 | |
| 968 | assert(strlen(argv[i]) < sizeof(item->key_name.value)); |
| 969 | |
| 970 | strcpy((char *)item->key_name.value, argv[i]); |
| 971 | |
| 972 | if (value_type != ICMAP_VALUETYPE_NOT_EXIST) { |
| 973 | err = icmap_get(argv[i], item->value, &value_len, &value_type); |
| 974 | if (err != CS_OK) { |
| 975 | goto free_mem; |
| 976 | } |
| 977 | } |
| 978 | |
| 979 | req_exec_cmap_iovec[i + 1].iov_base = (char *)item; |
| 980 | req_exec_cmap_iovec[i + 1].iov_len = item_len; |
| 981 | msg_len += item_len; |
| 982 | |
| 983 | qb_log(LOG_TRACE, "Item %u - type %u, len %zu", i, item->value_type, item->value_len); |
no test coverage detected