~ubuntu-branches/ubuntu/oneiric/bluez/oneiric-201105191013

« back to all changes in this revision

Viewing changes to serial/port.c

  • Committer: Bazaar Package Importer
  • Author(s): Robert Ancell
  • Date: 2010-12-20 16:08:47 UTC
  • mfrom: (1.1.24 upstream)
  • Revision ID: james.westby@ubuntu.com-20101220160847-wc1907sgz6x3vjz7
Tags: 4.82-0ubuntu1
New upstream release

Show diffs side-by-side

added added

removed removed

Lines of Context:
57
57
#include "port.h"
58
58
 
59
59
#define SERIAL_PORT_INTERFACE   "org.bluez.Serial"
60
 
#define ERROR_INVALID_ARGS      "org.bluez.Error.InvalidArguments"
61
 
#define ERROR_DOES_NOT_EXIST    "org.bluez.Error.DoesNotExist"
62
60
 
63
61
#define MAX_OPEN_TRIES          5
64
62
#define OPEN_WAIT               300     /* ms. udev node creation retry wait */
236
234
        g_slist_free(devices);
237
235
}
238
236
 
239
 
static inline DBusMessage *does_not_exist(DBusMessage *msg,
240
 
                                        const char *description)
241
 
{
242
 
        return g_dbus_create_error(msg, ERROR_INTERFACE ".DoesNotExist",
243
 
                                                        "%s", description);
244
 
}
245
 
 
246
 
static inline DBusMessage *invalid_arguments(DBusMessage *msg,
247
 
                                        const char *description)
248
 
{
249
 
        return g_dbus_create_error(msg, ERROR_INTERFACE ".InvalidArguments",
250
 
                                                        "%s", description);
251
 
}
252
 
 
253
 
static inline DBusMessage *failed(DBusMessage *msg, const char *description)
254
 
{
255
 
        return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed",
256
 
                                                        "%s", description);
257
 
}
258
 
 
259
237
static void open_notify(int fd, int err, struct serial_port *port)
260
238
{
261
239
        struct serial_device *device = port->device;
262
240
        DBusMessage *reply;
263
241
 
264
 
        if (err) {
 
242
        if (err < 0) {
265
243
                /* Max tries exceeded */
266
244
                port_release(port);
267
 
                reply = failed(port->msg, strerror(err));
 
245
                reply = btd_error_failed(port->msg, strerror(-err));
268
246
        } else {
269
247
                port->fd = fd;
270
248
                reply = g_dbus_create_reply(port->msg,
287
265
 
288
266
        fd = open(port->dev, O_RDONLY | O_NOCTTY);
289
267
        if (fd < 0) {
290
 
                int err = errno;
 
268
                int err = -errno;
291
269
                error("Could not open %s: %s (%d)",
292
 
                                port->dev, strerror(err), err);
 
270
                                port->dev, strerror(-err), -err);
293
271
                if (!--ntries) {
294
272
                        /* Reporting error */
295
273
                        open_notify(fd, err, port);
332
310
 
333
311
        if (conn_err) {
334
312
                error("%s", conn_err->message);
335
 
                reply = failed(port->msg, conn_err->message);
 
313
                reply = btd_error_failed(port->msg, conn_err->message);
336
314
                goto fail;
337
315
        }
338
316
 
349
327
        sk = g_io_channel_unix_get_fd(chan);
350
328
        port->id = ioctl(sk, RFCOMMCREATEDEV, &req);
351
329
        if (port->id < 0) {
352
 
                int err = errno;
353
 
                error("ioctl(RFCOMMCREATEDEV): %s (%d)", strerror(err), err);
354
 
                reply = failed(port->msg, strerror(err));
 
330
                int err = -errno;
 
331
                error("ioctl(RFCOMMCREATEDEV): %s (%d)", strerror(-err), -err);
 
332
                reply = btd_error_failed(port->msg, strerror(-err));
355
333
                g_io_channel_shutdown(chan, TRUE, NULL);
356
334
                goto fail;
357
335
        }
394
372
        if (err < 0) {
395
373
                error("Unable to get service record: %s (%d)", strerror(-err),
396
374
                        -err);
397
 
                reply = failed(port->msg, strerror(-err));
 
375
                reply = btd_error_failed(port->msg, strerror(-err));
398
376
                goto failed;
399
377
        }
400
378
 
401
379
        if (!recs || !recs->data) {
402
380
                error("No record found");
403
 
                reply = failed(port->msg, "No record found");
 
381
                reply = btd_error_failed(port->msg, "No record found");
404
382
                goto failed;
405
383
        }
406
384
 
408
386
 
409
387
        if (sdp_get_access_protos(record, &protos) < 0) {
410
388
                error("Unable to get access protos from port record");
411
 
                reply = failed(port->msg, "Invalid channel");
 
389
                reply = btd_error_failed(port->msg, "Invalid channel");
412
390
                goto failed;
413
391
        }
414
392
 
425
403
                                BT_IO_OPT_INVALID);
426
404
        if (!port->io) {
427
405
                error("%s", gerr->message);
428
 
                reply = failed(port->msg, gerr->message);
 
406
                reply = btd_error_failed(port->msg, gerr->message);
429
407
                g_error_free(gerr);
430
408
                goto failed;
431
409
        }
505
483
 
506
484
                channel = strtol(pattern, &endptr, 10);
507
485
                if ((endptr && *endptr != '\0') || channel < 1 || channel > 30)
508
 
                        return does_not_exist(msg, "Does not match");
 
486
                        return btd_error_does_not_exist(msg);
509
487
 
510
488
                port = create_port(device, NULL, channel);
511
489
        }
512
490
 
513
491
        if (port->listener_id)
514
 
                return failed(msg, "Port already in use");
 
492
                return btd_error_failed(msg, "Port already in use");
515
493
 
516
494
        port->listener_id = g_dbus_add_disconnect_watch(conn,
517
495
                                                dbus_message_get_sender(msg),
521
499
 
522
500
        err = connect_port(port);
523
501
        if (err < 0) {
524
 
                DBusMessage *reply;
525
 
 
526
502
                error("%s", strerror(-err));
527
503
                g_dbus_remove_watch(conn, port->listener_id);
528
504
                port->listener_id = 0;
529
 
                reply = failed(msg, strerror(-err));
530
 
                return reply;
 
505
 
 
506
                return btd_error_failed(msg, strerror(-err));
531
507
        }
532
508
 
533
509
        return NULL;
546
522
 
547
523
        port = find_port(device->ports, dev);
548
524
        if (!port)
549
 
                return does_not_exist(msg, "Port does not exist");
 
525
                return btd_error_does_not_exist(msg);
550
526
 
551
527
        if (!port->listener_id)
552
 
                return failed(msg, "Not connected");
 
528
                return btd_error_not_connected(msg);
553
529
 
554
530
        owner = dbus_message_get_sender(port->msg);
555
531
        caller = dbus_message_get_sender(msg);
556
532
        if (!g_str_equal(owner, caller))
557
 
                return failed(msg, "Operation not permited");
 
533
                return btd_error_not_authorized(msg);
558
534
 
559
535
        port_release(port);
560
536