diff options
Diffstat (limited to 'serial/manager.c')
| -rw-r--r-- | serial/manager.c | 143 | 
1 files changed, 74 insertions, 69 deletions
diff --git a/serial/manager.c b/serial/manager.c index ed46a1d6..b45958b9 100644 --- a/serial/manager.c +++ b/serial/manager.c @@ -217,13 +217,13 @@ static void open_notify(int fd, int err, struct pending_connect *pc)  	if (err) {  		/* Max tries exceeded */  		rfcomm_release(pc->id); -		err_connection_failed(pc->conn, pc->msg, strerror(err)); +		error_connection_attempt_failed(pc->conn, pc->msg, err);  		return;  	}  	if (pc->canceled) {  		rfcomm_release(pc->id); -		err_connection_canceled(pc->conn, pc->msg); +		error_canceled(pc->conn, pc->msg, "Connection canceled");  		return;  	} @@ -352,7 +352,7 @@ static gboolean rfcomm_connect_cb(GIOChannel *chan,  	socklen_t len;  	if (pc->canceled) { -		err_connection_canceled(pc->conn, pc->msg); +		error_canceled(pc->conn, pc->msg, "Connection canceled");  		goto fail;  	} @@ -360,7 +360,7 @@ static gboolean rfcomm_connect_cb(GIOChannel *chan,  		/* Avoid close invalid file descriptor */  		g_io_channel_unref(pc->io);  		pc->io = NULL; -		err_connection_canceled(pc->conn, pc->msg); +		error_canceled(pc->conn, pc->msg, "Connection canceled");  		goto fail;  	} @@ -370,14 +370,13 @@ static gboolean rfcomm_connect_cb(GIOChannel *chan,  		err = errno;  		error("getsockopt(SO_ERROR): %s (%d)",  				strerror(err), err); -		err_connection_failed(pc->conn, -				pc->msg, strerror(err)); +		error_connection_attempt_failed(pc->conn, pc->msg, err);  		goto fail;  	}  	if (ret != 0) {  		error("connect(): %s (%d)", strerror(ret), ret); -		err_connection_failed(pc->conn, pc->msg, strerror(ret)); +		error_connection_attempt_failed(pc->conn, pc->msg, ret);  		goto fail;  	} @@ -394,7 +393,7 @@ static gboolean rfcomm_connect_cb(GIOChannel *chan,  	if (pc->id < 0) {  		err = errno;  		error("ioctl(RFCOMMCREATEDEV): %s (%d)", strerror(err), err); -		err_connection_failed(pc->conn, pc->msg, strerror(err)); +		error_connection_attempt_failed(pc->conn, pc->msg, err);  		goto fail;  	}  	pc->dev	= g_new0(char, 16); @@ -483,17 +482,19 @@ static void record_reply(DBusPendingCall *call, void *data)  	pc = data;  	if (pc->canceled) { -		err_connection_canceled(pc->conn, pc->msg); +		error_canceled(pc->conn, pc->msg, "Connection canceled");  		goto fail;  	}  	dbus_error_init(&derr);  	if (dbus_set_error_from_message(&derr, reply)) { +		/* FIXME : forward error as is */  		if (dbus_error_has_name(&derr,  				"org.bluez.Error.ConnectionAttemptFailed")) -			err_connection_failed(pc->conn, pc->msg, derr.message); +			error_connection_attempt_failed(pc->conn, pc->msg, +					EIO);  		else -			err_not_supported(pc->conn, pc->msg); +			error_not_supported(pc->conn, pc->msg);  		error("GetRemoteServiceRecord: %s(%s)",  					derr.name, derr.message); @@ -504,14 +505,14 @@ static void record_reply(DBusPendingCall *call, void *data)  	if (!dbus_message_get_args(reply, &derr,  				DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &rec_bin, &len,  				DBUS_TYPE_INVALID)) { -		err_not_supported(pc->conn, pc->msg); +		error_not_supported(pc->conn, pc->msg);  		error("%s: %s", derr.name, derr.message);  		dbus_error_free(&derr);  		goto fail;  	}  	if (len == 0) { -		err_not_supported(pc->conn, pc->msg); +		error_not_supported(pc->conn, pc->msg);  		error("Invalid service record length");  		goto fail;  	} @@ -519,12 +520,12 @@ static void record_reply(DBusPendingCall *call, void *data)  	rec = sdp_extract_pdu(rec_bin, &scanned);  	if (!rec) {  		error("Can't extract SDP record."); -		err_not_supported(pc->conn, pc->msg); +		error_not_supported(pc->conn, pc->msg);  		goto fail;  	}  	if (len != scanned || (sdp_get_access_protos(rec, &protos) < 0)) { -		err_not_supported(pc->conn, pc->msg); +		error_not_supported(pc->conn, pc->msg);  		goto fail;  	} @@ -534,7 +535,7 @@ static void record_reply(DBusPendingCall *call, void *data)  	if (ch < 1 || ch > 30) {  		error("Channel out of range: %d", ch); -		err_not_supported(pc->conn, pc->msg); +		error_not_supported(pc->conn, pc->msg);  		goto fail;  	}  	if (dbus_message_has_member(pc->msg, "CreatePort")) { @@ -548,7 +549,7 @@ static void record_reply(DBusPendingCall *call, void *data)  		str2ba(pc->bda, &dst);  		err = rfcomm_bind(&pc->src, &dst, -1, ch);  		if (err < 0) { -			err_failed(pc->conn, pc->msg, strerror(-err)); +			error_failed_errno(pc->conn, pc->msg, -err);  			goto fail;  		}  		snprintf(port_name, sizeof(port_name), "/dev/rfcomm%d", err); @@ -585,7 +586,8 @@ static void record_reply(DBusPendingCall *call, void *data)  		err = rfcomm_connect(pc);  		if (err < 0) {  			error("RFCOMM connection failed"); -			err_connection_failed(pc->conn, pc->msg, strerror(-err)); +			error_connection_attempt_failed(pc->conn,  +					pc->msg, -err);  			goto fail;  		} @@ -646,17 +648,19 @@ static void handles_reply(DBusPendingCall *call, void *data)  	pc = data;  	if (pc->canceled) { -		err_connection_canceled(pc->conn, pc->msg); +		error_canceled(pc->conn, pc->msg, "Connection canceled");  		goto fail;  	}  	dbus_error_init(&derr);  	if (dbus_set_error_from_message(&derr, reply)) { +		/* FIXME : forward error as is */  		if (dbus_error_has_name(&derr,  				"org.bluez.Error.ConnectionAttemptFailed")) -			err_connection_failed(pc->conn, pc->msg, derr.message); +			error_connection_attempt_failed(pc->conn,  +					pc->msg, EIO);  		else -			err_not_supported(pc->conn, pc->msg); +			error_not_supported(pc->conn, pc->msg);  		error("GetRemoteServiceHandles: %s(%s)",  					derr.name, derr.message); @@ -667,19 +671,19 @@ static void handles_reply(DBusPendingCall *call, void *data)  	if (!dbus_message_get_args(reply, &derr,  				DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &phandle,  				&len, DBUS_TYPE_INVALID)) { -		err_not_supported(pc->conn, pc->msg); +		error_not_supported(pc->conn, pc->msg);  		error("%s: %s", derr.name, derr.message);  		dbus_error_free(&derr);  		goto fail;  	}  	if (len == 0) { -		err_not_supported(pc->conn, pc->msg); +		error_not_supported(pc->conn, pc->msg);  		goto fail;  	}  	if (get_record(pc, *phandle, record_reply) < 0) { -		err_not_supported(pc->conn, pc->msg); +		error_not_supported(pc->conn, pc->msg);  		goto fail;  	} @@ -780,18 +784,18 @@ static DBusHandlerResult create_port(DBusConnection *conn,  				DBUS_TYPE_STRING, &bda,  				DBUS_TYPE_STRING, &pattern,  				DBUS_TYPE_INVALID)) { -		err_invalid_args(conn, msg, derr.message); +		error_invalid_arguments(conn, msg, derr.message);  		dbus_error_free(&derr);  		return DBUS_HANDLER_RESULT_HANDLED;  	}  	pending = find_pending_connect_by_pattern(bda, pattern);  	if (pending) -		return err_connection_in_progress(conn, msg); +		return error_in_progress(conn, msg, "Connection in progress");  	dev_id = hci_get_route(NULL);  	if ((dev_id < 0) ||  (hci_devba(dev_id, &src) < 0)) -		return err_failed(conn, msg, "Adapter not available"); +		return error_failed(conn, msg, "Adapter not available");  	pc = g_new0(struct pending_connect, 1);  	bacpy(&pc->src, &src); @@ -809,7 +813,7 @@ static DBusHandlerResult create_port(DBusConnection *conn,  	if (pattern2uuid128(pattern, uuid, sizeof(uuid)) == 0) {  		if (get_handles(pc, uuid, handles_reply) < 0) {  			pending_connect_free(pc); -			return err_not_supported(conn, msg); +			return error_not_supported(conn, msg);  		}  		pending_connects = g_slist_append(pending_connects, pc);  		name_listener_add(conn, dbus_message_get_sender(msg), @@ -821,20 +825,20 @@ static DBusHandlerResult create_port(DBusConnection *conn,  	err = pattern2long(pattern, &val);  	if (err < 0) {  		pending_connect_free(pc); -		return err_invalid_args(conn, msg, "invalid pattern"); +		return error_invalid_arguments(conn, msg, "invalid pattern");  	}  	/* Record handle: starts at 0x10000 */  	if (strncasecmp("0x", pattern, 2) == 0) {  		if (val < 0x10000) {  			pending_connect_free(pc); -			return err_invalid_args(conn, msg, +			return error_invalid_arguments(conn, msg,  					"invalid record handle");  		}  		if (get_record(pc, val, record_reply) < 0) {  			pending_connect_free(pc); -			return err_not_supported(conn, msg); +			return error_not_supported(conn, msg);  		}  		pending_connects = g_slist_append(pending_connects, pc);  		name_listener_add(conn, dbus_message_get_sender(msg), @@ -845,13 +849,13 @@ static DBusHandlerResult create_port(DBusConnection *conn,  	pending_connect_free(pc);  	/* RFCOMM Channel range: 1 - 30 */  	if (val < 1 || val > 30) -		return err_invalid_args(conn, msg, +		return error_invalid_arguments(conn, msg,  				"invalid RFCOMM channel");  	str2ba(bda, &dst);  	err = rfcomm_bind(&src, &dst, -1, val);  	if (err < 0) -		return err_failed(conn, msg, strerror(-err)); +		return error_failed_errno(conn, msg, -err);  	snprintf(port_name, sizeof(port_name), "/dev/rfcomm%d", err);  	port_store(&src, &dst, err, val, NULL); @@ -919,21 +923,21 @@ static DBusHandlerResult remove_port(DBusConnection *conn,  	if (!dbus_message_get_args(msg, &derr,  				DBUS_TYPE_STRING, &path,  				DBUS_TYPE_INVALID)) { -		err_invalid_args(conn, msg, derr.message); +		error_invalid_arguments(conn, msg, derr.message);  		dbus_error_free(&derr);  		return DBUS_HANDLER_RESULT_HANDLED;  	}  	if (sscanf(path, SERIAL_MANAGER_PATH"/rfcomm%hd", &id) != 1) -		return err_does_not_exist(conn, msg, "Invalid RFCOMM node"); +		return error_does_not_exist(conn, msg, "Invalid RFCOMM node");  	di.id = id;  	if (ioctl(rfcomm_ctl, RFCOMMGETDEVINFO, &di) < 0) -		return err_does_not_exist(conn, msg, "Invalid RFCOMM node"); +		return error_does_not_exist(conn, msg, "Invalid RFCOMM node");  	port_delete(&di.src, &di.dst, id);  	if (port_unregister(path) < 0) -		return err_does_not_exist(conn, msg, "Invalid RFCOMM node"); +		return error_does_not_exist(conn, msg, "Invalid RFCOMM node");  	send_message_and_unref(conn,  			dbus_message_new_method_return(msg)); @@ -1391,7 +1395,7 @@ static DBusHandlerResult proxy_enable(DBusConnection *conn,  	int sk;  	if (prx->listen_watch) -		return err_failed(conn, msg, "Already enabled"); +		return error_failed(conn, msg, "Already enabled");  	/* Listen */  	/* FIXME: missing options */ @@ -1399,7 +1403,7 @@ static DBusHandlerResult proxy_enable(DBusConnection *conn,  	if (sk < 0) {  		const char *strerr = strerror(errno);  		error("RFCOMM listen socket failed: %s(%d)", strerr, errno); -		return err_failed(conn, msg, strerr); +		return error_failed(conn, msg, strerr);  	}  	/* Create the record */ @@ -1409,7 +1413,7 @@ static DBusHandlerResult proxy_enable(DBusConnection *conn,  	prx->record_id = add_proxy_record(conn, &buf);  	if (!prx->record_id) {  		close(sk); -		return err_failed(conn, msg, "Service registration failed"); +		return error_failed(conn, msg, "Service registration failed");  	}  	/* Add incomming connection watch */ @@ -1430,7 +1434,7 @@ static DBusHandlerResult proxy_disable(DBusConnection *conn,  	struct proxy *prx = data;  	if (!prx->listen_watch) -		return err_failed(conn, msg, "Not enabled"); +		return error_failed(conn, msg, "Not enabled");  	/* Remove the watches and unregister the record: see watch notify */  	g_source_remove(prx->listen_watch); @@ -1597,7 +1601,7 @@ static DBusHandlerResult proxy_set_serial_params(DBusConnection *conn,  	/* Don't allow change TTY settings if it is open */  	if (prx->local_watch) -		return err_failed(conn, msg, "Not allowed"); +		return error_failed(conn, msg, "Not allowed");  	dbus_error_init(&derr);  	if (!dbus_message_get_args(msg, &derr, @@ -1606,23 +1610,23 @@ static DBusHandlerResult proxy_set_serial_params(DBusConnection *conn,  				DBUS_TYPE_BYTE, &stopbits,  				DBUS_TYPE_STRING, &paritystr,  				DBUS_TYPE_INVALID)) { -		err_invalid_args(conn, msg, derr.message); +		error_invalid_arguments(conn, msg, derr.message);  		dbus_error_free(&derr);  		return DBUS_HANDLER_RESULT_HANDLED;  	}  	if (str2speed(ratestr, &speed)  == B0) -		return err_invalid_args(conn, msg, "Invalid baud rate"); +		return error_invalid_arguments(conn, msg, "Invalid baud rate");  	ctrl = prx->proxy_ti.c_cflag;  	if (set_databits(databits, &ctrl) < 0) -		return err_invalid_args(conn, msg, "Invalid data bits"); +		return error_invalid_arguments(conn, msg, "Invalid data bits");  	if (set_stopbits(stopbits, &ctrl) < 0) -		return err_invalid_args(conn, msg, "Invalid stop bits"); +		return error_invalid_arguments(conn, msg, "Invalid stop bits");  	if (set_parity(paritystr, &ctrl) < 0) -		return err_invalid_args(conn, msg, "Invalid parity"); +		return error_invalid_arguments(conn, msg, "Invalid parity");  	prx->proxy_ti.c_cflag = ctrl;  	prx->proxy_ti.c_cflag |= (CLOCAL | CREAD); @@ -1802,27 +1806,27 @@ static DBusHandlerResult create_proxy(DBusConnection *conn,  				DBUS_TYPE_STRING, &uuid128,  				DBUS_TYPE_STRING, &address,  				DBUS_TYPE_INVALID)) { -		err_invalid_args(conn, msg, derr.message); +		error_invalid_arguments(conn, msg, derr.message);  		dbus_error_free(&derr);  		return DBUS_HANDLER_RESULT_HANDLED;  	}  	if (str2uuid(&uuid, uuid128) < 0) -		return err_invalid_args(conn, msg, "Invalid UUID"); +		return error_invalid_arguments(conn, msg, "Invalid UUID");  	type = addr2type(address);  	if (type == UNKNOWN_PROXY_TYPE) -		return err_invalid_args(conn, msg, "Invalid address"); +		return error_invalid_arguments(conn, msg, "Invalid address");  	/* Only one proxy per address(TTY or unix socket) is allowed */  	if (g_slist_find_custom(proxies_paths,  				address, (GCompareFunc) proxycmp)) -		return err_already_exists(conn, msg, "Proxy already exists"); +		return error_already_exists(conn, msg, "Proxy already exists");  	dev_id = hci_get_route(NULL);  	if ((dev_id < 0) || (hci_devba(dev_id, &src) < 0)) {  		error("Adapter not available"); -		return err_failed(conn, msg, "Adapter not available"); +		return error_failed(conn, msg, "Adapter not available");  	}  	reply = dbus_message_new_method_return(msg); @@ -1838,7 +1842,7 @@ static DBusHandlerResult create_proxy(DBusConnection *conn,  	if (ret < 0) {  		dbus_message_unref(reply); -		return err_failed(conn, msg, "Create object path failed"); +		return error_failed(conn, msg, "Create object path failed");  	}  	dbus_connection_emit_signal(connection, SERIAL_MANAGER_PATH, @@ -1879,14 +1883,14 @@ static DBusHandlerResult remove_proxy(DBusConnection *conn,  	if (!dbus_message_get_args(msg, &derr,  				DBUS_TYPE_STRING, &path,  				DBUS_TYPE_INVALID)) { -		err_invalid_args(conn, msg, derr.message); +		error_invalid_arguments(conn, msg, derr.message);  		dbus_error_free(&derr);  		return DBUS_HANDLER_RESULT_HANDLED;  	}  	l = g_slist_find_custom(proxies_paths, path, (GCompareFunc) strcmp);  	if (!l) -		return err_does_not_exist(conn, msg, "Invalid proxy path"); +		return error_does_not_exist(conn, msg, "Invalid proxy path");  	/* Remove from storage */  	if (dbus_connection_get_object_user_data(conn, @@ -1923,18 +1927,18 @@ static DBusHandlerResult connect_service(DBusConnection *conn,  				DBUS_TYPE_STRING, &bda,  				DBUS_TYPE_STRING, &pattern,  				DBUS_TYPE_INVALID)) { -		err_invalid_args(conn, msg, derr.message); +		error_invalid_arguments(conn, msg, derr.message);  		dbus_error_free(&derr);  		return DBUS_HANDLER_RESULT_HANDLED;  	}  	pending = find_pending_connect_by_pattern(bda, pattern);  	if (pending) -		return err_connection_in_progress(conn, msg); +		return error_in_progress(conn, msg, "Connection in progress");  	dev_id = hci_get_route(NULL);  	if ((dev_id < 0) || (hci_devba(dev_id, &src) < 0)) -		return err_failed(conn, msg, "Adapter not available"); +		return error_failed(conn, msg, "Adapter not available");  	pc = g_new0(struct pending_connect, 1);  	bacpy(&pc->src, &src); @@ -1952,7 +1956,7 @@ static DBusHandlerResult connect_service(DBusConnection *conn,  	if (pattern2uuid128(pattern, uuid, sizeof(uuid)) == 0) {  		if (get_handles(pc, uuid, handles_reply) < 0) {  			pending_connect_free(pc); -			return err_not_supported(conn, msg); +			return error_not_supported(conn, msg);  		}  		pending_connects = g_slist_append(pending_connects, pc);  		goto done; @@ -1962,20 +1966,20 @@ static DBusHandlerResult connect_service(DBusConnection *conn,  	err = pattern2long(pattern, &val);  	if (err < 0) {  		pending_connect_free(pc); -		return err_invalid_args(conn, msg, "invalid pattern"); +		return error_invalid_arguments(conn, msg, "invalid pattern");  	}  	/* Record handle: starts at 0x10000 */  	if (strncasecmp("0x", pattern, 2) == 0) {  		if (val < 0x10000) {  			pending_connect_free(pc); -			return err_invalid_args(conn, msg, +			return error_invalid_arguments(conn, msg,  					"invalid record handle");  		}  		if (get_record(pc, val, record_reply) < 0) {  			pending_connect_free(pc); -			return err_not_supported(conn, msg); +			return error_not_supported(conn, msg);  		}  		pending_connects = g_slist_append(pending_connects, pc);  		goto done; @@ -1984,7 +1988,7 @@ static DBusHandlerResult connect_service(DBusConnection *conn,  	/* RFCOMM Channel range: 1 - 30 */  	if (val < 1 || val > 30) {  		pending_connect_free(pc); -		return err_invalid_args(conn, msg, +		return error_invalid_arguments(conn, msg,  				"invalid RFCOMM channel");  	} @@ -1998,7 +2002,7 @@ static DBusHandlerResult connect_service(DBusConnection *conn,  		error("RFCOMM connect failed: %s(%d)", strerr, -err);  		pending_connects = g_slist_remove(pending_connects, pc);  		pending_connect_free(pc); -		return err_connection_failed(conn, msg, strerr); +		return error_connection_attempt_failed(conn, msg, -err);  	}  done:  	name_listener_add(conn, dbus_message_get_sender(msg), @@ -2018,17 +2022,17 @@ static DBusHandlerResult disconnect_service(DBusConnection *conn,  	if (!dbus_message_get_args(msg, &derr,  				DBUS_TYPE_STRING, &name,  				DBUS_TYPE_INVALID)) { -		err_invalid_args(conn, msg, derr.message); +		error_invalid_arguments(conn, msg, derr.message);  		dbus_error_free(&derr);  		return DBUS_HANDLER_RESULT_HANDLED;  	}  	if (sscanf(name, "/dev/rfcomm%d", &id) != 1) -		return err_invalid_args(conn, msg, "invalid RFCOMM node"); +		return error_invalid_arguments(conn, msg, "invalid RFCOMM node");  	err = port_remove_listener(dbus_message_get_sender(msg), name);  	if (err < 0) -		return err_does_not_exist(conn, msg, "Invalid RFCOMM node"); +		return error_does_not_exist(conn, msg, "Invalid RFCOMM node");  	send_message_and_unref(conn,  			dbus_message_new_method_return(msg)); @@ -2054,14 +2058,15 @@ static DBusHandlerResult cancel_connect_service(DBusConnection *conn,  				DBUS_TYPE_STRING, &bda,  				DBUS_TYPE_STRING, &pattern,  				DBUS_TYPE_INVALID)) { -		err_invalid_args(conn, msg, derr.message); +		error_invalid_arguments(conn, msg, derr.message);  		dbus_error_free(&derr);  		return DBUS_HANDLER_RESULT_HANDLED;  	}  	pending = find_pending_connect_by_pattern(bda, pattern);  	if (!pending) -		return err_connection_not_in_progress(conn, msg); +		return error_does_not_exist(conn, msg,  +				"No such connection request");  	reply = dbus_message_new_method_return(msg);  	if (!reply)  | 
