+static void smpi_shared_alloc_free(void *p)
+{
+ shared_data_t *data = p;
+ xbt_free(data->loc);
+ xbt_free(data);
+}
+
+static char *smpi_shared_alloc_hash(char *loc)
+{
+ char hash[42];
+ char s[7];
+ unsigned val;
+ int i, j;
+
+ xbt_sha(loc, hash);
+ hash[41] = '\0';
+ s[6] = '\0';
+ loc = xbt_realloc(loc, 30);
+ loc[0] = '/';
+ for (i = 0; i < 40; i += 6) { /* base64 encode */
+ memcpy(s, hash + i, 6);
+ val = strtoul(s, NULL, 16);
+ for (j = 0; j < 4; j++) {
+ unsigned char x = (val >> (18 - 3 * j)) & 0x3f;
+ loc[1 + 4 * i / 6 + j] =
+ "ABCDEFGHIJKLMNOPQRSTUVZXYZabcdefghijklmnopqrstuvzxyz0123456789-_"[x];
+ }
+ }
+ loc[29] = '\0';
+ return loc;
+}
+