*/
#include "includes.h"
-
#include "messages.h"
#include "serverid.h"
#include "smbd/globals.h"
#include "smbd/scavenger.h"
#include "locking/proto.h"
+#include "lib/util/server_id.h"
#include "lib/util/util_process.h"
-#include "lib/sys_rw.h"
+#include "lib/util/sys_rw_data.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_SCAVENGER
static int smbd_scavenger_server_id_destructor(struct server_id *id)
{
- serverid_deregister(*id);
return 0;
}
static bool scavenger_say_hello(int fd, struct server_id self)
{
- const uint8_t *msg = (const uint8_t *)&self;
- size_t remaining = sizeof(self);
- size_t ofs = 0;
+ ssize_t ret;
struct server_id_buf tmp;
- while (remaining > 0) {
- ssize_t ret;
-
- ret = sys_write(fd, msg + ofs, remaining);
- if (ret == -1) {
- DEBUG(2, ("Failed to write to pipe: %s\n",
- strerror(errno)));
- return false;
- }
- remaining -= ret;
+ ret = write_data(fd, &self, sizeof(self));
+ if (ret == -1) {
+ DEBUG(2, ("Failed to write to pipe: %s\n", strerror(errno)));
+ return false;
+ }
+ if (ret < sizeof(self)) {
+ DBG_WARNING("Could not write serverid\n");
+ return false;
}
DEBUG(4, ("scavenger_say_hello: self[%s]\n",
static bool scavenger_wait_hello(int fd, struct server_id *child)
{
- uint8_t *msg = (uint8_t *)child;
- size_t remaining = sizeof(*child);
- size_t ofs = 0;
struct server_id_buf tmp;
+ ssize_t ret;
- while (remaining > 0) {
- ssize_t ret;
-
- ret = sys_read(fd, msg + ofs, remaining);
- if (ret == -1) {
- DEBUG(2, ("Failed to read from pipe: %s\n",
- strerror(errno)));
- return false;
- }
- remaining -= ret;
+ ret = read_data(fd, child, sizeof(struct server_id));
+ if (ret == -1) {
+ DEBUG(2, ("Failed to read from pipe: %s\n",
+ strerror(errno)));
+ return false;
+ }
+ if (ret < sizeof(struct server_id)) {
+ DBG_WARNING("Could not read serverid\n");
+ return false;
}
DEBUG(4, ("scavenger_say_hello: child[%s]\n",
struct tevent_fd *fde = NULL;
int fds[2];
int ret;
- uint64_t unique_id;
bool ok;
SMB_ASSERT(server_id_equal(&state->parent_id, &self));
smb_set_close_on_exec(fds[0]);
smb_set_close_on_exec(fds[1]);
- unique_id = serverid_get_random_unique_id();
-
ret = fork();
if (ret == -1) {
int err = errno;
close(fds[0]);
- set_my_unique_id(unique_id);
-
status = smbd_reinit_after_fork(state->msg, state->ev,
true, "smbd-scavenger");
if (!NT_STATUS_IS_OK(status)) {
scavenger_setup_sig_term_handler(state->ev);
- if (!serverid_register(*state->scavenger_id,
- FLAG_MSG_GENERAL)) {
- DBG_WARNING("serverid_register failed");
- exit_server("serverid_register failed");
- return false;
- }
-
ok = scavenger_say_hello(fds[1], *state->scavenger_id);
if (!ok) {
DEBUG(2, ("scavenger_say_hello failed\n"));