mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	improve error messages
Send create_object error messages to the new resource id so that the client can better know what proxy is failing. Use resource_remove when create_object fails because the core will already send a remove_id on failure. Try to send other errors to the proxy that made the request if possible.
This commit is contained in:
		
							parent
							
								
									b96daabb2f
								
							
						
					
					
						commit
						65d72bb87c
					
				
					 9 changed files with 40 additions and 33 deletions
				
			
		| 
						 | 
					@ -117,14 +117,17 @@ static void node_initialized(void *data)
 | 
				
			||||||
	if (res < 0)
 | 
						if (res < 0)
 | 
				
			||||||
		goto error_bind;
 | 
							goto error_bind;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((bound_resource = pw_impl_client_find_resource(client, nd->new_id)) == NULL)
 | 
						if ((bound_resource = pw_impl_client_find_resource(client, nd->new_id)) == NULL) {
 | 
				
			||||||
 | 
							res = -EIO;
 | 
				
			||||||
		goto error_bind;
 | 
							goto error_bind;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_resource_add_listener(bound_resource, &nd->resource_listener, &resource_events, nd);
 | 
						pw_resource_add_listener(bound_resource, &nd->resource_listener, &resource_events, nd);
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
error_bind:
 | 
					error_bind:
 | 
				
			||||||
	pw_resource_error(nd->resource, res, "can't bind adapter node");
 | 
						pw_resource_errorf_id(nd->resource, nd->new_id, res,
 | 
				
			||||||
 | 
								"can't bind adapter node: %s", spa_strerror(res));
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -218,19 +221,19 @@ error_properties:
 | 
				
			||||||
	res = -EINVAL;
 | 
						res = -EINVAL;
 | 
				
			||||||
	pw_log_error("factory %p: usage: " FACTORY_USAGE, d->this);
 | 
						pw_log_error("factory %p: usage: " FACTORY_USAGE, d->this);
 | 
				
			||||||
	if (resource)
 | 
						if (resource)
 | 
				
			||||||
		pw_resource_error(resource, res, "usage: " FACTORY_USAGE);
 | 
							pw_resource_errorf_id(resource, new_id, res, "usage: " FACTORY_USAGE);
 | 
				
			||||||
	goto error_cleanup;
 | 
						goto error_cleanup;
 | 
				
			||||||
error_no_mem:
 | 
					error_no_mem:
 | 
				
			||||||
	res = -errno;
 | 
						res = -errno;
 | 
				
			||||||
	pw_log_error("can't create node: %m");
 | 
						pw_log_error("can't create node: %m");
 | 
				
			||||||
	if (resource)
 | 
						if (resource)
 | 
				
			||||||
		pw_resource_errorf(resource, res, "can't create node: %s", spa_strerror(res));
 | 
							pw_resource_errorf_id(resource, new_id, res, "can't create node: %s", spa_strerror(res));
 | 
				
			||||||
	goto error_cleanup;
 | 
						goto error_cleanup;
 | 
				
			||||||
error_usage:
 | 
					error_usage:
 | 
				
			||||||
	res = -EINVAL;
 | 
						res = -EINVAL;
 | 
				
			||||||
	pw_log_error("usage: "ADAPTER_USAGE);
 | 
						pw_log_error("usage: "ADAPTER_USAGE);
 | 
				
			||||||
	if (resource)
 | 
						if (resource)
 | 
				
			||||||
		pw_resource_error(resource, res, "usage: "ADAPTER_USAGE);
 | 
							pw_resource_errorf_id(resource, new_id, res, "usage: "ADAPTER_USAGE);
 | 
				
			||||||
	goto error_cleanup;
 | 
						goto error_cleanup;
 | 
				
			||||||
error_cleanup:
 | 
					error_cleanup:
 | 
				
			||||||
	if (properties)
 | 
						if (properties)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -99,19 +99,19 @@ static void *create_object(void *_data,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
error_resource:
 | 
					error_resource:
 | 
				
			||||||
	pw_log_error("can't create resource: %s", spa_strerror(res));
 | 
						pw_log_error("can't create resource: %s", spa_strerror(res));
 | 
				
			||||||
	pw_resource_errorf(resource, res, "can't create resource: %s", spa_strerror(res));
 | 
						pw_resource_errorf_id(resource, new_id, res, "can't create resource: %s", spa_strerror(res));
 | 
				
			||||||
	goto error_exit;
 | 
						goto error_exit;
 | 
				
			||||||
error_properties:
 | 
					error_properties:
 | 
				
			||||||
	pw_log_error("can't create properties: %s", spa_strerror(res));
 | 
						pw_log_error("can't create properties: %s", spa_strerror(res));
 | 
				
			||||||
	pw_resource_errorf(resource, res, "can't create properties: %s", spa_strerror(res));
 | 
						pw_resource_errorf_id(resource, new_id, res, "can't create properties: %s", spa_strerror(res));
 | 
				
			||||||
	goto error_exit_free;
 | 
						goto error_exit_free;
 | 
				
			||||||
error_device:
 | 
					error_device:
 | 
				
			||||||
	pw_log_error("can't create device: %s", spa_strerror(res));
 | 
						pw_log_error("can't create device: %s", spa_strerror(res));
 | 
				
			||||||
	pw_resource_errorf(resource, res, "can't create device: %s", spa_strerror(res));
 | 
						pw_resource_errorf_id(resource, new_id, res, "can't create device: %s", spa_strerror(res));
 | 
				
			||||||
	goto error_exit_free;
 | 
						goto error_exit_free;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
error_exit_free:
 | 
					error_exit_free:
 | 
				
			||||||
	pw_resource_destroy(device_resource);
 | 
						pw_resource_remove(device_resource);
 | 
				
			||||||
error_exit:
 | 
					error_exit:
 | 
				
			||||||
	errno = -res;
 | 
						errno = -res;
 | 
				
			||||||
	return NULL;
 | 
						return NULL;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -93,15 +93,15 @@ static void *create_object(void *_data,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
error_resource:
 | 
					error_resource:
 | 
				
			||||||
	pw_log_error("can't create resource: %s", spa_strerror(res));
 | 
						pw_log_error("can't create resource: %s", spa_strerror(res));
 | 
				
			||||||
	pw_resource_errorf(resource, res, "can't create resource: %s", spa_strerror(res));
 | 
						pw_resource_errorf_id(resource, new_id, res, "can't create resource: %s", spa_strerror(res));
 | 
				
			||||||
	goto error_exit;
 | 
						goto error_exit;
 | 
				
			||||||
error_node:
 | 
					error_node:
 | 
				
			||||||
	pw_log_error("can't create node: %s", spa_strerror(res));
 | 
						pw_log_error("can't create node: %s", spa_strerror(res));
 | 
				
			||||||
	pw_resource_errorf(resource, res, "can't create node: %s", spa_strerror(res));
 | 
						pw_resource_errorf(node_resource, res, "can't create node: %s", spa_strerror(res));
 | 
				
			||||||
	goto error_exit_free;
 | 
						goto error_exit_free;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
error_exit_free:
 | 
					error_exit_free:
 | 
				
			||||||
	pw_resource_destroy(node_resource);
 | 
						pw_resource_remove(node_resource);
 | 
				
			||||||
error_exit:
 | 
					error_exit:
 | 
				
			||||||
	errno = -res;
 | 
						errno = -res;
 | 
				
			||||||
	return NULL;
 | 
						return NULL;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -134,7 +134,8 @@ static void link_initialized(void *data)
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
error_bind:
 | 
					error_bind:
 | 
				
			||||||
	pw_resource_errorf(ld->factory_resource, res, "can't bind link: %s", spa_strerror(res));
 | 
						pw_resource_errorf_id(ld->factory_resource, ld->new_id, res,
 | 
				
			||||||
 | 
								"can't bind link: %s", spa_strerror(res));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct pw_impl_link_events link_events = {
 | 
					static const struct pw_impl_link_events link_events = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -78,26 +78,24 @@ static void *create_object(void *_data,
 | 
				
			||||||
		goto error_resource;
 | 
							goto error_resource;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_log_debug(".");
 | 
					 | 
				
			||||||
	result = pw_metadata_new(pw_impl_client_get_context(client), metadata_resource, properties);
 | 
						result = pw_metadata_new(pw_impl_client_get_context(client), metadata_resource, properties);
 | 
				
			||||||
	if (result == NULL) {
 | 
						if (result == NULL) {
 | 
				
			||||||
		res = -errno;
 | 
							res = -errno;
 | 
				
			||||||
		goto error_node;
 | 
							goto error_node;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	pw_log_debug(".");
 | 
					 | 
				
			||||||
	return result;
 | 
						return result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
error_resource:
 | 
					error_resource:
 | 
				
			||||||
	pw_log_error("can't create resource: %s", spa_strerror(res));
 | 
						pw_log_error("can't create resource: %s", spa_strerror(res));
 | 
				
			||||||
	pw_resource_errorf(resource, res, "can't create resource: %s", spa_strerror(res));
 | 
						pw_resource_errorf_id(resource, new_id, res, "can't create resource: %s", spa_strerror(res));
 | 
				
			||||||
	goto error_exit;
 | 
						goto error_exit;
 | 
				
			||||||
error_node:
 | 
					error_node:
 | 
				
			||||||
	pw_log_error("can't create metadata: %s", spa_strerror(res));
 | 
						pw_log_error("can't create metadata: %s", spa_strerror(res));
 | 
				
			||||||
	pw_resource_errorf(resource, res, "can't create metadata: %s", spa_strerror(res));
 | 
						pw_resource_errorf_id(resource, new_id, res, "can't create metadata: %s", spa_strerror(res));
 | 
				
			||||||
	goto error_exit_free;
 | 
						goto error_exit_free;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
error_exit_free:
 | 
					error_exit_free:
 | 
				
			||||||
	pw_resource_destroy(metadata_resource);
 | 
						pw_resource_remove(metadata_resource);
 | 
				
			||||||
error_exit:
 | 
					error_exit:
 | 
				
			||||||
	errno = -res;
 | 
						errno = -res;
 | 
				
			||||||
	return NULL;
 | 
						return NULL;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -200,7 +200,7 @@ process_messages(struct client_data *data)
 | 
				
			||||||
		required = demarshal[msg->opcode].permissions | PW_PERM_X;
 | 
							required = demarshal[msg->opcode].permissions | PW_PERM_X;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if ((required & permissions) != required) {
 | 
							if ((required & permissions) != required) {
 | 
				
			||||||
			pw_resource_errorf(resource,
 | 
								pw_resource_errorf_id(resource, msg->id,
 | 
				
			||||||
				-EACCES, "no permission to call method %u on %u (requires %08x, have %08x)",
 | 
									-EACCES, "no permission to call method %u on %u (requires %08x, have %08x)",
 | 
				
			||||||
				msg->opcode, msg->id, required, permissions);
 | 
									msg->opcode, msg->id, required, permissions);
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
| 
						 | 
					@ -215,15 +215,16 @@ done:
 | 
				
			||||||
	return res;
 | 
						return res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
invalid_method:
 | 
					invalid_method:
 | 
				
			||||||
	pw_resource_errorf(resource, res, "invalid method id:%u op:%u",
 | 
						pw_resource_errorf_id(resource, msg->id, res, "invalid method id:%u op:%u",
 | 
				
			||||||
			msg->id, msg->opcode);
 | 
								msg->id, msg->opcode);
 | 
				
			||||||
	goto done;
 | 
						goto done;
 | 
				
			||||||
invalid_message:
 | 
					invalid_message:
 | 
				
			||||||
	pw_resource_errorf(resource, res, "invalid message received id:%u op:%u (%s)",
 | 
						pw_resource_errorf_id(resource, msg->id, res, "invalid message id:%u op:%u (%s)",
 | 
				
			||||||
			msg->id, msg->opcode, spa_strerror(res));
 | 
								msg->id, msg->opcode, spa_strerror(res));
 | 
				
			||||||
	debug_msg("*invalid message*", msg, true);
 | 
						debug_msg("*invalid message*", msg, true);
 | 
				
			||||||
	goto done;
 | 
						goto done;
 | 
				
			||||||
error:
 | 
					error:
 | 
				
			||||||
 | 
						if (client->core_resource)
 | 
				
			||||||
		pw_resource_errorf(client->core_resource, res, "client error %d (%s)",
 | 
							pw_resource_errorf(client->core_resource, res, "client error %d (%s)",
 | 
				
			||||||
				res, spa_strerror(res));
 | 
									res, spa_strerror(res));
 | 
				
			||||||
	goto done;
 | 
						goto done;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -135,12 +135,14 @@ error_properties:
 | 
				
			||||||
	res = -EINVAL;
 | 
						res = -EINVAL;
 | 
				
			||||||
	pw_log_error("factory %p: usage: " FACTORY_USAGE, data->this);
 | 
						pw_log_error("factory %p: usage: " FACTORY_USAGE, data->this);
 | 
				
			||||||
	if (resource)
 | 
						if (resource)
 | 
				
			||||||
		pw_resource_error(resource, res, "usage: " FACTORY_USAGE);
 | 
							pw_resource_errorf_id(resource, new_id, res,
 | 
				
			||||||
 | 
									"usage: "FACTORY_USAGE);
 | 
				
			||||||
	goto error_exit;
 | 
						goto error_exit;
 | 
				
			||||||
error_device:
 | 
					error_device:
 | 
				
			||||||
	pw_log_error("can't create device: %s", spa_strerror(res));
 | 
						pw_log_error("can't create device: %s", spa_strerror(res));
 | 
				
			||||||
	if (resource)
 | 
						if (resource)
 | 
				
			||||||
		pw_resource_errorf(resource, res, "can't create device: %s", spa_strerror(res));
 | 
							pw_resource_errorf_id(resource, new_id, res,
 | 
				
			||||||
 | 
									"can't create device: %s", spa_strerror(res));
 | 
				
			||||||
	goto error_exit;
 | 
						goto error_exit;
 | 
				
			||||||
error_exit:
 | 
					error_exit:
 | 
				
			||||||
	errno = -res;
 | 
						errno = -res;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -161,16 +161,18 @@ error_properties:
 | 
				
			||||||
	res = -EINVAL;
 | 
						res = -EINVAL;
 | 
				
			||||||
	pw_log_error("factory %p: usage: " FACTORY_USAGE, data->this);
 | 
						pw_log_error("factory %p: usage: " FACTORY_USAGE, data->this);
 | 
				
			||||||
	if (resource)
 | 
						if (resource)
 | 
				
			||||||
		pw_resource_error(resource, res, "usage: " FACTORY_USAGE);
 | 
							pw_resource_errorf_id(resource, new_id, res,
 | 
				
			||||||
 | 
									"usage: "FACTORY_USAGE);
 | 
				
			||||||
	goto error_exit_cleanup;
 | 
						goto error_exit_cleanup;
 | 
				
			||||||
error_create_node:
 | 
					error_create_node:
 | 
				
			||||||
	res = -errno;
 | 
						res = -errno;
 | 
				
			||||||
	pw_log_error("can't create node: %m");
 | 
						pw_log_error("can't create node: %m");
 | 
				
			||||||
	if (resource)
 | 
						if (resource)
 | 
				
			||||||
		pw_resource_errorf(resource, res, "can't create node: %s", spa_strerror(res));
 | 
							pw_resource_errorf_id(resource, new_id, res,
 | 
				
			||||||
 | 
									"can't create node: %s", spa_strerror(res));
 | 
				
			||||||
	goto error_exit;
 | 
						goto error_exit;
 | 
				
			||||||
error_bind:
 | 
					error_bind:
 | 
				
			||||||
	pw_resource_error(resource, res, "can't bind node");
 | 
						pw_resource_errorf_id(resource, new_id, res, "can't bind node");
 | 
				
			||||||
	goto error_exit;
 | 
						goto error_exit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
error_exit_cleanup:
 | 
					error_exit_cleanup:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -69,11 +69,11 @@ static void * registry_bind(void *object, uint32_t id,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
error_no_id:
 | 
					error_no_id:
 | 
				
			||||||
	pw_log_debug("registry %p: no global with id %u to bind to %u", resource, id, new_id);
 | 
						pw_log_debug("registry %p: no global with id %u to bind to %u", resource, id, new_id);
 | 
				
			||||||
	pw_resource_errorf(resource, -ENOENT, "no global %u", id);
 | 
						pw_resource_errorf_id(resource, new_id, -ENOENT, "no global %u", id);
 | 
				
			||||||
	goto error_exit_clean;
 | 
						goto error_exit_clean;
 | 
				
			||||||
error_wrong_interface:
 | 
					error_wrong_interface:
 | 
				
			||||||
	pw_log_debug("registry %p: global with id %u has no interface %s", resource, id, type);
 | 
						pw_log_debug("registry %p: global with id %u has no interface %s", resource, id, type);
 | 
				
			||||||
	pw_resource_errorf(resource, -ENOENT, "no interface %s", type);
 | 
						pw_resource_errorf_id(resource, new_id, -ENOENT, "no interface %s", type);
 | 
				
			||||||
	goto error_exit_clean;
 | 
						goto error_exit_clean;
 | 
				
			||||||
error_exit_clean:
 | 
					error_exit_clean:
 | 
				
			||||||
	/* unmark the new_id the map, the client does not yet know about the failed
 | 
						/* unmark the new_id the map, the client does not yet know about the failed
 | 
				
			||||||
| 
						 | 
					@ -317,18 +317,18 @@ core_create_object(void *object,
 | 
				
			||||||
error_no_factory:
 | 
					error_no_factory:
 | 
				
			||||||
	res = -ENOENT;
 | 
						res = -ENOENT;
 | 
				
			||||||
	pw_log_debug(NAME" %p: can't find factory '%s'", context, factory_name);
 | 
						pw_log_debug(NAME" %p: can't find factory '%s'", context, factory_name);
 | 
				
			||||||
	pw_resource_errorf(resource, res, "unknown factory name %s", factory_name);
 | 
						pw_resource_errorf_id(resource, new_id, res, "unknown factory name %s", factory_name);
 | 
				
			||||||
	goto error_exit;
 | 
						goto error_exit;
 | 
				
			||||||
error_version:
 | 
					error_version:
 | 
				
			||||||
error_type:
 | 
					error_type:
 | 
				
			||||||
	res = -EPROTO;
 | 
						res = -EPROTO;
 | 
				
			||||||
	pw_log_debug(NAME" %p: invalid resource type/version", context);
 | 
						pw_log_debug(NAME" %p: invalid resource type/version", context);
 | 
				
			||||||
	pw_resource_errorf(resource, res, "wrong resource type/version");
 | 
						pw_resource_errorf_id(resource, new_id, res, "wrong resource type/version");
 | 
				
			||||||
	goto error_exit;
 | 
						goto error_exit;
 | 
				
			||||||
error_properties:
 | 
					error_properties:
 | 
				
			||||||
	res = -errno;
 | 
						res = -errno;
 | 
				
			||||||
	pw_log_debug(NAME" %p: can't create properties: %m", context);
 | 
						pw_log_debug(NAME" %p: can't create properties: %m", context);
 | 
				
			||||||
	pw_resource_errorf(resource, res, "can't create properties: %s", spa_strerror(res));
 | 
						pw_resource_errorf_id(resource, new_id, res, "can't create properties: %s", spa_strerror(res));
 | 
				
			||||||
	goto error_exit;
 | 
						goto error_exit;
 | 
				
			||||||
error_create_failed:
 | 
					error_create_failed:
 | 
				
			||||||
	res = -errno;
 | 
						res = -errno;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue