mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	command: add exec command
Add exec command and use it to start the session manager by default
This commit is contained in:
		
							parent
							
								
									575e177a48
								
							
						
					
					
						commit
						eb765b26b3
					
				
					 2 changed files with 50 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -1,13 +1,12 @@
 | 
			
		|||
#load-module libpipewire-module-protocol-dbus
 | 
			
		||||
#load-module libpipewire-module-rtkit
 | 
			
		||||
load-module libpipewire-module-rtkit
 | 
			
		||||
load-module libpipewire-module-protocol-native
 | 
			
		||||
load-module libpipewire-module-suspend-on-idle
 | 
			
		||||
load-module libpipewire-module-spa-monitor alsa/libspa-alsa alsa-monitor alsa
 | 
			
		||||
load-module libpipewire-module-spa-monitor v4l2/libspa-v4l2 v4l2-monitor v4l2
 | 
			
		||||
load-module libpipewire-module-spa-monitor bluez5/libspa-bluez5 bluez5-monitor bluez5
 | 
			
		||||
#load-module libpipewire-module-spa-node videotestsrc/libspa-videotestsrc videotestsrc videotestsrc Spa:POD:Object:Props:patternType=Spa:POD:Object:Props:patternType:snow
 | 
			
		||||
load-module libpipewire-module-client-node
 | 
			
		||||
load-module libpipewire-module-flatpak
 | 
			
		||||
load-module libpipewire-module-media-session
 | 
			
		||||
load-module libpipewire-module-audio-dsp
 | 
			
		||||
load-module libpipewire-module-link-factory
 | 
			
		||||
exec build/src/examples/media-session
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,6 +21,8 @@
 | 
			
		|||
#include <errno.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
 | 
			
		||||
#include <pipewire/pipewire.h>
 | 
			
		||||
#include <pipewire/utils.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -33,6 +35,7 @@
 | 
			
		|||
 | 
			
		||||
static struct pw_command *parse_command_help(const char *line, char **err);
 | 
			
		||||
static struct pw_command *parse_command_module_load(const char *line, char **err);
 | 
			
		||||
static struct pw_command *parse_command_exec(const char *line, char **err);
 | 
			
		||||
 | 
			
		||||
struct impl {
 | 
			
		||||
	struct pw_command this;
 | 
			
		||||
| 
						 | 
				
			
			@ -49,6 +52,7 @@ struct command_parse {
 | 
			
		|||
static const struct command_parse parsers[] = {
 | 
			
		||||
	{"help", "Show this help", parse_command_help},
 | 
			
		||||
	{"load-module", "Load a module", parse_command_module_load},
 | 
			
		||||
	{"exec", "Execute a program", parse_command_exec},
 | 
			
		||||
	{NULL, NULL, NULL }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -127,6 +131,50 @@ static struct pw_command *parse_command_module_load(const char *line, char **err
 | 
			
		|||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
execute_command_exec(struct pw_command *command, struct pw_core *core, char **err)
 | 
			
		||||
{
 | 
			
		||||
	int pid;
 | 
			
		||||
 | 
			
		||||
	pid = fork();
 | 
			
		||||
 | 
			
		||||
	if (pid == 0) {
 | 
			
		||||
		pw_log_info("exec %s", command->args[1]);
 | 
			
		||||
		execv(command->args[1], command->args);
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		pw_log_info("exec got pid %d", pid);
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct pw_command *parse_command_exec(const char *line, char **err)
 | 
			
		||||
{
 | 
			
		||||
	struct impl *impl;
 | 
			
		||||
	struct pw_command *this;
 | 
			
		||||
 | 
			
		||||
	impl = calloc(1, sizeof(struct impl));
 | 
			
		||||
	if (impl == NULL)
 | 
			
		||||
		goto no_mem;
 | 
			
		||||
 | 
			
		||||
	this = &impl->this;
 | 
			
		||||
	this->func = execute_command_exec;
 | 
			
		||||
	this->args = pw_split_strv(line, whitespace, INT_MAX, &this->n_args);
 | 
			
		||||
 | 
			
		||||
	if (this->n_args < 1)
 | 
			
		||||
		goto no_executable;
 | 
			
		||||
 | 
			
		||||
	return this;
 | 
			
		||||
 | 
			
		||||
      no_executable:
 | 
			
		||||
	asprintf(err, "requires an executable name");
 | 
			
		||||
	pw_free_strv(this->args);
 | 
			
		||||
	return NULL;
 | 
			
		||||
      no_mem:
 | 
			
		||||
	asprintf(err, "no memory");
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Free command
 | 
			
		||||
 *
 | 
			
		||||
 * \param command a command to free
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue