mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
locking: Create commandline arguments for locking helper
Signed-off-by: Amitay Isaacs <amitay@gmail.com> (This used to be ctdb commit f665e3d540c90579952e590caa5828acb581ae61)
This commit is contained in:
parent
30aa825c1e
commit
e30978eae1
@ -685,6 +685,121 @@ static char *lock_child_log_prefix(struct lock_context *lock_ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int db_count_handler(struct ctdb_db_context *ctdb_db, uint32_t priority,
|
||||||
|
void *private_data)
|
||||||
|
{
|
||||||
|
int *count = (int *)private_data;
|
||||||
|
|
||||||
|
(*count)++;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct db_namelist {
|
||||||
|
char **names;
|
||||||
|
int n;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int db_name_handler(struct ctdb_db_context *ctdb_db, uint32_t priority,
|
||||||
|
void *private_data)
|
||||||
|
{
|
||||||
|
struct db_namelist *list = (struct db_namelist *)private_data;
|
||||||
|
|
||||||
|
list->names[list->n] = talloc_strdup(list->names, ctdb_db->db_path);
|
||||||
|
list->n++;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char **lock_helper_args(TALLOC_CTX *mem_ctx, struct lock_context *lock_ctx, int fd)
|
||||||
|
{
|
||||||
|
struct ctdb_context *ctdb = lock_ctx->ctdb;
|
||||||
|
char **args = NULL;
|
||||||
|
int nargs, i;
|
||||||
|
int priority;
|
||||||
|
struct db_namelist list;
|
||||||
|
|
||||||
|
switch (lock_ctx->type) {
|
||||||
|
case LOCK_RECORD:
|
||||||
|
nargs = 6;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LOCK_DB:
|
||||||
|
nargs = 5;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LOCK_ALLDB_PRIO:
|
||||||
|
nargs = 4;
|
||||||
|
ctdb_db_iterator(ctdb, lock_ctx->priority, db_count_handler, &nargs);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LOCK_ALLDB:
|
||||||
|
nargs = 4;
|
||||||
|
for (priority=1; priority<NUM_DB_PRIORITIES; priority++) {
|
||||||
|
ctdb_db_iterator(ctdb, priority, db_count_handler, &nargs);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add extra argument for null termination */
|
||||||
|
nargs++;
|
||||||
|
|
||||||
|
args = talloc_array(mem_ctx, char *, nargs);
|
||||||
|
if (args == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
args[0] = talloc_strdup(args, "ctdb_lock_helper");
|
||||||
|
args[1] = talloc_asprintf(args, "%d", getpid());
|
||||||
|
args[2] = talloc_asprintf(args, "%d", fd);
|
||||||
|
|
||||||
|
switch (lock_ctx->type) {
|
||||||
|
case LOCK_RECORD:
|
||||||
|
args[3] = talloc_strdup(args, "RECORD");
|
||||||
|
args[4] = talloc_strdup(args, lock_ctx->ctdb_db->db_path);
|
||||||
|
if (lock_ctx->key.dsize == 0) {
|
||||||
|
args[5] = talloc_strdup(args, "NULL");
|
||||||
|
} else {
|
||||||
|
args[5] = hex_encode_talloc(args, lock_ctx->key.dptr, lock_ctx->key.dsize);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LOCK_DB:
|
||||||
|
args[3] = talloc_strdup(args, "DB");
|
||||||
|
args[4] = talloc_strdup(args, lock_ctx->ctdb_db->db_path);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LOCK_ALLDB_PRIO:
|
||||||
|
args[3] = talloc_strdup(args, "DB");
|
||||||
|
list.names = args;
|
||||||
|
list.n = 4;
|
||||||
|
ctdb_db_iterator(ctdb, lock_ctx->priority, db_name_handler, &list);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LOCK_ALLDB:
|
||||||
|
args[3] = talloc_strdup(args, "DB");
|
||||||
|
list.names = args;
|
||||||
|
list.n = 4;
|
||||||
|
for (priority=1; priority<NUM_DB_PRIORITIES; priority++) {
|
||||||
|
ctdb_db_iterator(ctdb, priority, db_name_handler, &list);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make sure last argument is NULL */
|
||||||
|
args[nargs-1] = NULL;
|
||||||
|
|
||||||
|
for (i=0; i<nargs-1; i++) {
|
||||||
|
if (args[i] == NULL) {
|
||||||
|
talloc_free(args);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Schedule a new lock child process
|
* Schedule a new lock child process
|
||||||
* Set up callback handler and timeout handler
|
* Set up callback handler and timeout handler
|
||||||
|
Loading…
Reference in New Issue
Block a user