static int my_com_netsplit_Nih_Test_colour_set (NihDBusObject * object, NihDBusMessage * message, DBusMessageIter *iter) { DBusMessageIter variter; const char * value_dbus; char * value; nih_assert (object != NULL); nih_assert (message != NULL); nih_assert (iter != NULL); /* Recurse into the variant */ if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_VARIANT) { nih_dbus_error_raise_printf (DBUS_ERROR_INVALID_ARGS, "Invalid arguments to colour property"); return -1; } dbus_message_iter_recurse (iter, &variter); /* Demarshal a char * from the message */ if (dbus_message_iter_get_arg_type (&variter) != DBUS_TYPE_STRING) { nih_dbus_error_raise_printf (DBUS_ERROR_INVALID_ARGS, "Invalid arguments to colour property"); return -1; } dbus_message_iter_get_basic (&variter, &value_dbus); value = nih_strdup (message, value_dbus); if (! value) { nih_error_raise_no_memory (); return -1; } dbus_message_iter_next (&variter); dbus_message_iter_next (iter); if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_INVALID) { nih_dbus_error_raise_printf (DBUS_ERROR_INVALID_ARGS, "Invalid arguments to colour property"); return -1; } /* Call the handler function */ if (my_test_set_colour (object->data, message, value) < 0) return -1; return 0; }
static int my_com_netsplit_Nih_Test_touch_set (NihDBusObject * object, NihDBusMessage * message, DBusMessageIter *iter) { DBusMessageIter variter; int value; nih_assert (object != NULL); nih_assert (message != NULL); nih_assert (iter != NULL); /* Recurse into the variant */ if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_VARIANT) { nih_dbus_error_raise_printf (DBUS_ERROR_INVALID_ARGS, "Invalid arguments to touch property"); return -1; } dbus_message_iter_recurse (iter, &variter); /* Demarshal a int from the message */ if (dbus_message_iter_get_arg_type (&variter) != DBUS_TYPE_BOOLEAN) { nih_dbus_error_raise_printf (DBUS_ERROR_INVALID_ARGS, "Invalid arguments to touch property"); return -1; } dbus_message_iter_get_basic (&variter, &value); dbus_message_iter_next (&variter); dbus_message_iter_next (iter); if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_INVALID) { nih_dbus_error_raise_printf (DBUS_ERROR_INVALID_ARGS, "Invalid arguments to touch property"); return -1; } /* Call the handler function */ if (my_test_set_touch (object->data, message, value) < 0) return -1; return 0; }
int chmod_main(const char *controller, const char *cgroup, const char *file, struct ucred p, struct ucred r, int mode) { char rcgpath[MAXPATHLEN]; nih_local char *path = NULL; if (!sane_cgroup(cgroup)) { nih_error("%s: unsafe cgroup", __func__); return -1; } if (file && ( strchr(file, '/') || strchr(file, '\\')) ) { nih_dbus_error_raise_printf (DBUS_ERROR_INVALID_ARGS, "invalid file"); return -1; } // Get r's current cgroup in rcgpath if (!compute_pid_cgroup(r.pid, controller, "", rcgpath, NULL)) { nih_error("%s: Could not determine the requested cgroup", __func__); return -1; } path = NIH_MUST( nih_sprintf(NULL, "%s/%s", rcgpath, cgroup) ); if (file && strlen(file)) NIH_MUST( nih_strcat_sprintf(&path, NULL, "/%s", file) ); if (realpath_escapes(path, rcgpath)) { nih_error("%s: Invalid path %s", __func__, path); return -1; } // is r allowed to descend under the parent dir? if (!may_access(r.pid, r.uid, r.gid, path, O_RDONLY)) { nih_error("%s: pid %d (uid %u gid %u) may not read under %s", __func__, r.pid, r.uid, r.gid, path); return -1; } // does r have privilege over the cgroup dir? if (!may_access(r.pid, r.uid, r.gid, path, O_RDWR)) { nih_error("%s: Pid %d may not chmod %s\n", __func__, r.pid, path); return -1; } // go ahead and chmod it. if (!chmod_cgroup_path(path, mode)) { nih_error("%s: Failed to change mode on %s to %d", __func__, path, mode); return -1; } return 0; }
int main (int argc, char *argv[]) { char ** args; DBusConnection * conn; int fd, optval = 1, exitval = 1, ret; DBusMessage *message = NULL, *reply = NULL; DBusMessageIter iter; dbus_uint32_t serial;; nih_main_init (argv[0]); nih_option_set_synopsis (_("Control group client")); args = nih_option_parser (NULL, argc, argv, options, FALSE); if (! args) exit (1); if (!controller) usage(argv[0]); if (pid == -1) pid = getpid(); conn = nih_dbus_connect("unix:path=/tmp/cgmanager", NULL); nih_assert (conn != NULL); message = dbus_message_new_method_call(dbus_bus_get_unique_name(conn), "/org/linuxcontainers/cgmanager", "org.linuxcontainers.cgmanager0_0", "getPidCgroup"); if (!dbus_connection_get_socket(conn, &fd)) { nih_dbus_error_raise_printf (DBUS_ERROR_INVALID_ARGS, "Could not get socket"); return -1; } if (setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &optval, sizeof(optval)) == -1) { perror("setsockopt"); return -1; } dbus_message_iter_init_append(message, &iter); if (! dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &controller)) { nih_error_raise_no_memory (); return -1; } dbus_message_iter_init_append(message, &iter); if (! dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &pid)) { nih_error_raise_no_memory (); return -1; } if (!dbus_connection_send(conn, message, &serial)) { nih_error("failed to send dbus message"); return -1; } dbus_connection_flush(conn); /* If we're sending our own pid, or if we're root, then * we can send an SCM_CREDENTIAL */ if (pid == getpid() || geteuid() == 0) { if (send_pid(fd, pid)) { nih_error("Error sending pid over SCM_CREDENTIAL"); goto out; } } while (!(reply = dbus_connection_pop_message(conn))) dbus_connection_read_write(conn, -1); if (dbus_message_get_reply_serial(reply) != serial) { nih_error("wrong serial on reply"); goto out; } dbus_message_iter_init(reply, &iter); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) { nih_error("Got bad reply type: %d", dbus_message_iter_get_arg_type(&iter)); goto out; } char *str_value; dbus_message_iter_get_basic(&iter, &str_value); printf("%s\n", str_value); exitval = 0; out: if (message) dbus_message_unref(message); if (reply) dbus_message_unref(reply); dbus_connection_unref (conn); exit(exitval); }