+static int
+add_remove_device_container(int fd, int add_remove, struct stat *stb)
+{
+ int devnum = fd2devnum(fd);
+ char *devname = devnum2devname(devnum);
+ int sfd = devname ? connect_monitor(devname) : -1;
+ struct md_message msg;
+ int err = 0;
+
+ if (devname && sfd < 0) {
+ fprintf(stderr, Name ": Cannot connect to monitor for %s: %s\n",
+ devname, strerror(errno));
+ free(devname);
+ return 1;
+ } else if (sfd < 0) {
+ fprintf(stderr, Name ": Cannot determine container name for"
+ " device number %d\n", devnum);
+ return 1;
+ }
+
+ if (add_remove)
+ ack(sfd, 0, 0);
+ else if (send_remove_device(sfd, stb->st_rdev, 0, 0) != 0) {
+ fprintf(stderr, Name ": Failed to send \'%s device\'"
+ " message to the container monitor\n",
+ add_remove ? "add" : "remove");
+ err = 1;
+ }
+
+ /* check the reply */
+ if (!err && receive_message(sfd, &msg, 0) != 0) {
+ fprintf(stderr, Name ": Failed to receive an acknowledgement"
+ " from the container monitor\n");
+ err = 1;
+ }
+
+ if (!err && msg.seq != 0) {
+ fprintf(stderr, Name ": %s device failed error code %d\n",
+ add_remove ? "Add" : "Remove", msg.seq);
+ err = 1;
+ }
+
+ free(devname);
+ close(sfd);
+
+ return err;
+}
+