NTSTATUS gp_push_gpo (struct gp_context *gp_ctx, const char *local_path, struct gp_object *gpo) { NTSTATUS status; TALLOC_CTX *mem_ctx; struct gp_ini_context *ini; char *filename; mem_ctx = talloc_new(gp_ctx); NT_STATUS_HAVE_NO_MEMORY(mem_ctx); /* Get version from ini file */ /* FIXME: The local file system may be case sensitive */ filename = talloc_asprintf(mem_ctx, "%s/%s", local_path, "GPT.INI"); if (filename == NULL) { TALLOC_FREE(mem_ctx); return NT_STATUS_NO_MEMORY; } status = gp_parse_ini(mem_ctx, gp_ctx, local_path, &ini); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("Failed to parse GPT.INI.\n")); talloc_free(mem_ctx); return status; } /* Push the GPT to the remote sysvol */ status = gp_push_gpt(gp_ctx, local_path, gpo->file_sys_path); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("Failed to push GPT to DC's sysvol share.\n")); talloc_free(mem_ctx); return status; } /* Write version to LDAP */ status = gp_set_ldap_gpo(gp_ctx, gpo); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("Failed to set GPO options in DC's LDAP.\n")); talloc_free(mem_ctx); return status; } talloc_free(mem_ctx); return NT_STATUS_OK; }
NTSTATUS gp_create_gpt(struct gp_context *gp_ctx, const char *name, const char *file_sys_path) { TALLOC_CTX *mem_ctx; const char *tmp_dir, *policy_dir, *tmp_str; int rv; int fd; NTSTATUS status; const char *file_content = "[General]\r\nVersion=0\r\n"; /* Create a forked memory context, as a base for everything here */ mem_ctx = talloc_new(gp_ctx); NT_STATUS_HAVE_NO_MEMORY(mem_ctx); tmp_dir = gp_tmpdir(mem_ctx); NT_STATUS_HAVE_NO_MEMORY(tmp_dir); policy_dir = talloc_asprintf(mem_ctx, "%s/%s", tmp_dir, name); NT_STATUS_HAVE_NO_MEMORY(policy_dir); /* Create the directories */ rv = mkdir(policy_dir, 0755); if (rv < 0) { DEBUG(0, ("Could not create the policy dir: %s\n", policy_dir)); talloc_free(mem_ctx); return NT_STATUS_UNSUCCESSFUL; } tmp_str = talloc_asprintf(mem_ctx, "%s/User", policy_dir); NT_STATUS_HAVE_NO_MEMORY(tmp_str); rv = mkdir(tmp_str, 0755); if (rv < 0) { DEBUG(0, ("Could not create the User dir: %s\n", tmp_str)); talloc_free(mem_ctx); return NT_STATUS_UNSUCCESSFUL; } tmp_str = talloc_asprintf(mem_ctx, "%s/Machine", policy_dir); NT_STATUS_HAVE_NO_MEMORY(tmp_str); rv = mkdir(tmp_str, 0755); if (rv < 0) { DEBUG(0, ("Could not create the Machine dir: %s\n", tmp_str)); talloc_free(mem_ctx); return NT_STATUS_UNSUCCESSFUL; } /* Create a GPT.INI with version 0 */ tmp_str = talloc_asprintf(mem_ctx, "%s/GPT.INI", policy_dir); NT_STATUS_HAVE_NO_MEMORY(tmp_str); fd = open(tmp_str, O_CREAT | O_WRONLY, 0644); if (fd < 0) { DEBUG(0, ("Could not create the GPT.INI: %s\n", tmp_str)); talloc_free(mem_ctx); return NT_STATUS_UNSUCCESSFUL; } rv = write(fd, file_content, strlen(file_content)); if (rv != strlen(file_content)) { DEBUG(0, ("Short write in GPT.INI\n")); talloc_free(mem_ctx); return NT_STATUS_UNSUCCESSFUL; } close(fd); /* Upload the GPT to the sysvol share on a DC */ status = gp_push_gpt(gp_ctx, policy_dir, file_sys_path); if (!NT_STATUS_IS_OK(status)) { talloc_free(mem_ctx); return status; } talloc_free(mem_ctx); return NT_STATUS_OK; }