+ gid_t match_gid(gid_t gid, uint16 *flags_ptr)
+@@ -226,7 +230,7 @@ gid_t match_gid(gid_t gid, uint16 *flags
+ break;
+ }
+ if (!list)
+- list = recv_add_gid(gid, NULL);
++ list = recv_add_id(&gidmap, gid, NULL);
+ last = list;
+ }
+
+@@ -315,7 +319,7 @@ uid_t recv_user_name(int f, uid_t uid)
+ if (!name)
+ out_of_memory("recv_user_name");
+ read_sbuf(f, name, len);
+- node = recv_add_uid(uid, name); /* node keeps name's memory */
++ node = recv_add_id(&uidmap, uid, name); /* node keeps name's memory */
+ return node->id2;
+ }
+
+@@ -327,7 +331,7 @@ gid_t recv_group_name(int f, gid_t gid,
+ if (!name)
+ out_of_memory("recv_group_name");
+ read_sbuf(f, name, len);
+- node = recv_add_gid(gid, name); /* node keeps name's memory */
++ node = recv_add_id(&gidmap, gid, name); /* node keeps name's memory */
+ if (flags_ptr && node->flags & FLAG_SKIP_GROUP)
+ *flags_ptr |= FLAG_SKIP_GROUP;
+ return node->id2;
+@@ -354,17 +358,96 @@ void recv_id_list(int f, struct file_lis