summaryrefslogtreecommitdiffstats
path: root/dund
diff options
context:
space:
mode:
Diffstat (limited to 'dund')
-rw-r--r--dund/Makefile.am20
-rw-r--r--dund/dun.c331
-rw-r--r--dund/dund.172
-rw-r--r--dund/dund.h51
-rw-r--r--dund/lib.h88
-rw-r--r--dund/main.c635
-rw-r--r--dund/msdun.c151
-rw-r--r--dund/sdp.c208
8 files changed, 0 insertions, 1556 deletions
diff --git a/dund/Makefile.am b/dund/Makefile.am
deleted file mode 100644
index 260698ab..00000000
--- a/dund/Makefile.am
+++ /dev/null
@@ -1,20 +0,0 @@
-
-if DUND
-bin_PROGRAMS = dund
-
-dund_SOURCES = main.c dun.c dund.h sdp.c lib.h msdun.c
-
-dund_LDADD = @BLUEZ_LIBS@
-endif
-
-AM_CFLAGS = @BLUEZ_CFLAGS@
-
-if DUND
-if MANPAGES
-man_MANS = dund.1
-endif
-endif
-
-EXTRA_DIST = dund.1
-
-MAINTAINERCLEANFILES = Makefile.in
diff --git a/dund/dun.c b/dund/dun.c
deleted file mode 100644
index de437cf4..00000000
--- a/dund/dun.c
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- *
- * BlueZ - Bluetooth protocol stack for Linux
- *
- * Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
- * Copyright (C) 2002-2008 Marcel Holtmann <marcel@holtmann.org>
- *
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <errno.h>
-#include <ctype.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <syslog.h>
-#include <dirent.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <sys/param.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-
-#include <bluetooth/bluetooth.h>
-#include <bluetooth/rfcomm.h>
-
-#include "dund.h"
-#include "lib.h"
-
-#define PROC_BASE "/proc"
-
-static int for_each_port(int (*func)(struct rfcomm_dev_info *, unsigned long), unsigned long arg)
-{
- struct rfcomm_dev_list_req *dl;
- struct rfcomm_dev_info *di;
- long r = 0;
- int sk, i;
-
- sk = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_RFCOMM);
- if (sk < 0 ) {
- perror("Can't open RFCOMM control socket");
- exit(1);
- }
-
- dl = malloc(sizeof(*dl) + RFCOMM_MAX_DEV * sizeof(*di));
- if (!dl) {
- perror("Can't allocate request memory");
- close(sk);
- exit(1);
- }
-
- dl->dev_num = RFCOMM_MAX_DEV;
- di = dl->dev_info;
-
- if (ioctl(sk, RFCOMMGETDEVLIST, (void *) dl) < 0) {
- perror("Can't get device list");
- exit(1);
- }
-
- for (i = 0; i < dl->dev_num; i++) {
- r = func(di + i, arg);
- if (r) break;
- }
-
- close(sk);
- return r;
-}
-
-static int uses_rfcomm(char *path, char *dev)
-{
- struct dirent *de;
- DIR *dir;
-
- dir = opendir(path);
- if (!dir)
- return 0;
-
- if (chdir(path) < 0)
- return 0;
-
- while ((de = readdir(dir)) != NULL) {
- char link[PATH_MAX + 1];
- int len = readlink(de->d_name, link, sizeof(link));
- if (len > 0) {
- link[len] = 0;
- if (strstr(link, dev))
- return 1;
- }
- }
-
- closedir(dir);
-
- return 0;
-}
-
-static int find_pppd(int id, pid_t *pid)
-{
- struct dirent *de;
- char path[PATH_MAX + 1];
- char dev[10];
- int empty = 1;
- DIR *dir;
-
- dir = opendir(PROC_BASE);
- if (!dir) {
- perror(PROC_BASE);
- return -1;
- }
-
- sprintf(dev, "rfcomm%d", id);
-
- *pid = 0;
- while ((de = readdir(dir)) != NULL) {
- empty = 0;
- if (isdigit(de->d_name[0])) {
- sprintf(path, "%s/%s/fd", PROC_BASE, de->d_name);
- if (uses_rfcomm(path, dev)) {
- *pid = atoi(de->d_name);
- break;
- }
- }
- }
- closedir(dir);
-
- if (empty)
- fprintf(stderr, "%s is empty (not mounted ?)\n", PROC_BASE);
-
- return *pid != 0;
-}
-
-static int dun_exec(char *tty, char *prog, char **args)
-{
- int pid = fork();
- int fd;
-
- switch (pid) {
- case -1:
- return -1;
-
- case 0:
- break;
-
- default:
- return pid;
- }
-
- setsid();
-
- /* Close all FDs */
- for (fd = 3; fd < 20; fd++)
- close(fd);
-
- execvp(prog, args);
-
- syslog(LOG_ERR, "Error while executing %s", prog);
-
- exit(1);
-}
-
-static int dun_create_tty(int sk, char *tty, int size)
-{
- struct sockaddr_rc sa;
- struct stat st;
- socklen_t alen;
- int id, try = 30;
-
- struct rfcomm_dev_req req = {
- flags: (1 << RFCOMM_REUSE_DLC) | (1 << RFCOMM_RELEASE_ONHUP),
- dev_id: -1
- };
-
- alen = sizeof(sa);
- if (getpeername(sk, (struct sockaddr *) &sa, &alen) < 0)
- return -1;
- bacpy(&req.dst, &sa.rc_bdaddr);
-
- alen = sizeof(sa);
- if (getsockname(sk, (struct sockaddr *) &sa, &alen) < 0)
- return -1;
- bacpy(&req.src, &sa.rc_bdaddr);
- req.channel = sa.rc_channel;
-
- id = ioctl(sk, RFCOMMCREATEDEV, &req);
- if (id < 0)
- return id;
-
- snprintf(tty, size, "/dev/rfcomm%d", id);
- while (stat(tty, &st) < 0) {
- snprintf(tty, size, "/dev/bluetooth/rfcomm/%d", id);
- if (stat(tty, &st) < 0) {
- snprintf(tty, size, "/dev/rfcomm%d", id);
- if (try--) {
- usleep(100 * 1000);
- continue;
- }
-
- memset(&req, 0, sizeof(req));
- req.dev_id = id;
- ioctl(sk, RFCOMMRELEASEDEV, &req);
-
- return -1;
- }
- }
-
- return id;
-}
-
-int dun_init(void)
-{
- return 0;
-}
-
-int dun_cleanup(void)
-{
- return 0;
-}
-
-static int show_conn(struct rfcomm_dev_info *di, unsigned long arg)
-{
- pid_t pid;
-
- if (di->state == BT_CONNECTED &&
- (di->flags & (1<<RFCOMM_REUSE_DLC)) &&
- (di->flags & (1<<RFCOMM_TTY_ATTACHED)) &&
- (di->flags & (1<<RFCOMM_RELEASE_ONHUP))) {
-
- if (find_pppd(di->id, &pid)) {
- char dst[18];
- ba2str(&di->dst, dst);
-
- printf("rfcomm%d: %s channel %d pppd pid %d\n",
- di->id, dst, di->channel, pid);
- }
- }
- return 0;
-}
-
-static int kill_conn(struct rfcomm_dev_info *di, unsigned long arg)
-{
- bdaddr_t *dst = (bdaddr_t *) arg;
- pid_t pid;
-
- if (di->state == BT_CONNECTED &&
- (di->flags & (1<<RFCOMM_REUSE_DLC)) &&
- (di->flags & (1<<RFCOMM_TTY_ATTACHED)) &&
- (di->flags & (1<<RFCOMM_RELEASE_ONHUP))) {
-
- if (dst && bacmp(&di->dst, dst))
- return 0;
-
- if (find_pppd(di->id, &pid)) {
- if (kill(pid, SIGINT) < 0)
- perror("Kill");
-
- if (!dst)
- return 0;
- return 1;
- }
- }
- return 0;
-}
-
-int dun_show_connections(void)
-{
- for_each_port(show_conn, 0);
- return 0;
-}
-
-int dun_kill_connection(uint8_t *dst)
-{
- for_each_port(kill_conn, (unsigned long) dst);
- return 0;
-}
-
-int dun_kill_all_connections(void)
-{
- for_each_port(kill_conn, 0);
- return 0;
-}
-
-int dun_open_connection(int sk, char *pppd, char **args, int wait)
-{
- char tty[100];
- int pid;
-
- if (dun_create_tty(sk, tty, sizeof(tty) - 1) < 0) {
- syslog(LOG_ERR, "RFCOMM TTY creation failed. %s(%d)", strerror(errno), errno);
- return -1;
- }
-
- args[0] = "pppd";
- args[1] = tty;
- args[2] = "nodetach";
-
- pid = dun_exec(tty, pppd, args);
- if (pid < 0) {
- syslog(LOG_ERR, "Exec failed. %s(%d)", strerror(errno), errno);
- return -1;
- }
-
- if (wait) {
- int status;
- waitpid(pid, &status, 0);
- /* FIXME: Check for waitpid errors */
- }
-
- return 0;
-}
diff --git a/dund/dund.1 b/dund/dund.1
deleted file mode 100644
index 09fb7f75..00000000
--- a/dund/dund.1
+++ /dev/null
@@ -1,72 +0,0 @@
-.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.29.
-.TH BlueZ "1" "February 2003" "DUN daemon" "User Commands"
-.SH NAME
-dund \- BlueZ Bluetooth dial-up networking daemon
-.SH DESCRIPTION
-DUN daemon
-.SH SYNOPSIS
-dund <options> [pppd options]
-.SH OPTIONS
-.TP
-\fB\-\-show\fR \fB\-\-list\fR \fB\-l\fR
-Show active DUN connections
-.TP
-\fB\-\-listen\fR \fB\-s\fR
-Listen for DUN connections
-.TP
-\fB\-\-dialup\fR \fB\-u\fR
-Listen for dialup/telephone connections
-.TP
-\fB\-\-connect\fR \fB\-c\fR <bdaddr>
-Create DUN connection
-.TP
-\fB\-\-mrouter\fR \fB\-m\fR <bdaddr>
-Create mRouter connection
-.TP
-\fB\-\-search\fR \fB\-Q[duration]\fR
-Search and connect
-.TP
-\fB\-\-kill\fR \fB\-k\fR <bdaddr>
-Kill DUN connection
-.TP
-\fB\-\-killall\fR \fB\-K\fR
-Kill all DUN connections
-.TP
-\fB\-\-channel\fR \fB\-C\fR <channel>
-RFCOMM channel
-.TP
-\fB\-\-device\fR \fB\-i\fR <bdaddr>
-Source bdaddr
-.TP
-\fB\-\-nosdp\fR \fB\-D\fR
-Disable SDP
-.TP
-\fB\-\-auth\fR \fB\-A\fR
-Enable authentification
-.TP
-\fB\-\-encrypt\fR \fB\-E\fR
-Enable encryption
-.TP
-\fB\-\-secure\fR \fB\-S\fR
-Secure connection
-.TP
-\fB\-\-master\fR \fB\-M\fR
-Become the master of a piconet
-.TP
-\fB\-\-nodetach\fR \fB\-n\fR
-Do not become a daemon
-.TP
-\fB\-\-persist\fR \fB\-p[interval]\fR
-Persist mode
-.TP
-\fB\-\-pppd\fR \fB\-d\fR <pppd>
-Location of the PPP daemon (pppd)
-.TP
-\fB\-\-msdun\fR \fB\-X\fR [timeo]
-Enable Microsoft dialup networking support
-.TP
-\fB\-\-activesync\fR \fB\-a\fR
-Enable Microsoft ActiveSync networking
-.TP
-\fB\-\-cache\fR \fB\-C\fR [valid]
-Enable address cache
diff --git a/dund/dund.h b/dund/dund.h
deleted file mode 100644
index 00008578..00000000
--- a/dund/dund.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *
- * BlueZ - Bluetooth protocol stack for Linux
- *
- * Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
- * Copyright (C) 2002-2008 Marcel Holtmann <marcel@holtmann.org>
- *
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-/* DUN scripts & commands */
-#define DUN_CONFIG_DIR "/etc/bluetooth/dun"
-
-#define DUN_DEFAULT_CHANNEL 1
-
-#define DUN_MAX_PPP_OPTS 40
-
-/* DUN types */
-#define LANACCESS 0
-#define MROUTER 1
-#define ACTIVESYNC 2
-#define DIALUP 3
-
-/* DUN functions */
-int dun_init(void);
-int dun_cleanup(void);
-
-int dun_show_connections(void);
-int dun_kill_connection(uint8_t *dst);
-int dun_kill_all_connections(void);
-
-int dun_open_connection(int sk, char *pppd, char **pppd_opts, int wait);
-
-/* SDP functions */
-int dun_sdp_register(bdaddr_t *device, uint8_t channel, int type);
-void dun_sdp_unregister(void);
-int dun_sdp_search(bdaddr_t *src, bdaddr_t *dst, int *channel, int type);
diff --git a/dund/lib.h b/dund/lib.h
deleted file mode 100644
index e4b6e401..00000000
--- a/dund/lib.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *
- * BlueZ - Bluetooth protocol stack for Linux
- *
- * Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
- * Copyright (C) 2002-2008 Marcel Holtmann <marcel@holtmann.org>
- *
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include <sys/types.h>
-#include <errno.h>
-#include <signal.h>
-
-#ifndef min
-#define min(a,b) ( (a)<(b) ? (a):(b) )
-#endif
-
-/* IO cancelation */
-extern volatile sig_atomic_t __io_canceled;
-
-static inline void io_init(void)
-{
- __io_canceled = 0;
-}
-
-static inline void io_cancel(void)
-{
- __io_canceled = 1;
-}
-
-/* Read exactly len bytes (Signal safe)*/
-static inline int read_n(int fd, char *buf, int len)
-{
- register int t = 0, w;
-
- while (!__io_canceled && len > 0) {
- if ((w = read(fd, buf, len)) < 0) {
- if (errno == EINTR || errno == EAGAIN)
- continue;
- return -1;
- }
- if (!w)
- return 0;
- len -= w;
- buf += w;
- t += w;
- }
-
- return t;
-}
-
-/* Write exactly len bytes (Signal safe)*/
-static inline int write_n(int fd, char *buf, int len)
-{
- register int t = 0, w;
-
- while (!__io_canceled && len > 0) {
- if ((w = write(fd, buf, len)) < 0) {
- if (errno == EINTR || errno == EAGAIN)
- continue;
- return -1;
- }
- if (!w)
- return 0;
- len -= w;
- buf += w;
- t += w;
- }
-
- return t;
-}
-
-int ms_dun(int fd, int server, int timeo);
diff --git a/dund/main.c b/dund/main.c
deleted file mode 100644
index b14adce0..00000000
--- a/dund/main.c
+++ /dev/null
@@ -1,635 +0,0 @@
-/*
- *
- * BlueZ - Bluetooth protocol stack for Linux
- *
- * Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
- * Copyright (C) 2002-2008 Marcel Holtmann <marcel@holtmann.org>
- *
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-#include <signal.h>
-#include <getopt.h>
-
-#include <sys/socket.h>
-
-#include <bluetooth/bluetooth.h>
-#include <bluetooth/hci.h>
-#include <bluetooth/hci_lib.h>
-#include <bluetooth/rfcomm.h>
-
-#include "dund.h"
-#include "lib.h"
-
-volatile sig_atomic_t __io_canceled;
-
-/* MS dialup networking support (i.e. CLIENT / CLIENTSERVER thing) */
-static int msdun = 0;
-
-static char *pppd = "/usr/sbin/pppd";
-static char *pppd_opts[DUN_MAX_PPP_OPTS] =
- {
- /* First 3 are reserved */
- "", "", "",
- "noauth",
- "noipdefault",
- NULL
- };
-
-static int detach = 1;
-static int persist;
-static int use_sdp = 1;
-static int auth;
-static int encrypt;
-static int secure;
-static int master;
-static int type = LANACCESS;
-static int search_duration = 10;
-static uint use_cache;
-
-static int channel;
-
-static struct {
- uint valid;
- char dst[40];
- bdaddr_t bdaddr;
- int channel;
-} cache;
-
-static bdaddr_t src_addr = *BDADDR_ANY;
-static int src_dev = -1;
-
-volatile int terminate;
-
-enum {
- NONE,
- SHOW,
- LISTEN,
- CONNECT,
- KILL
-} modes;
-
-static int create_connection(char *dst, bdaddr_t *bdaddr, int mrouter);
-
-static int do_listen(void)
-{
- struct sockaddr_rc sa;
- int sk, lm;
-
- if (type == MROUTER) {
- if (!cache.valid)
- return -1;
-
- if (create_connection(cache.dst, &cache.bdaddr, type) < 0) {
- syslog(LOG_ERR, "Cannot connect to mRouter device. %s(%d)",
- strerror(errno), errno);
- return -1;
- }
- }
-
- if (!channel)
- channel = DUN_DEFAULT_CHANNEL;
-
- if (use_sdp)
- dun_sdp_register(&src_addr, channel, type);
-
- if (type == MROUTER)
- syslog(LOG_INFO, "Waiting for mRouter callback on channel %d", channel);
-
- /* Create RFCOMM socket */
- sk = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
- if (sk < 0) {
- syslog(LOG_ERR, "Cannot create RFCOMM socket. %s(%d)",
- strerror(errno), errno);
- return -1;
- }
-
- sa.rc_family = AF_BLUETOOTH;
- sa.rc_channel = channel;
- sa.rc_bdaddr = src_addr;
-
- if (bind(sk, (struct sockaddr *) &sa, sizeof(sa))) {
- syslog(LOG_ERR, "Bind failed. %s(%d)", strerror(errno), errno);
- return -1;
- }
-
- /* Set link mode */
- lm = 0;
- if (master)
- lm |= RFCOMM_LM_MASTER;
- if (auth)
- lm |= RFCOMM_LM_AUTH;
- if (encrypt)
- lm |= RFCOMM_LM_ENCRYPT;
- if (secure)
- lm |= RFCOMM_LM_SECURE;
-
- if (lm && setsockopt(sk, SOL_RFCOMM, RFCOMM_LM, &lm, sizeof(lm)) < 0) {
- syslog(LOG_ERR, "Failed to set link mode. %s(%d)", strerror(errno), errno);
- return -1;
- }
-
- listen(sk, 10);
-
- while (!terminate) {
- socklen_t alen = sizeof(sa);
- int nsk;
- char ba[40];
- char ch[10];
-
- nsk = accept(sk, (struct sockaddr *) &sa, &alen);
- if (nsk < 0) {
- syslog(LOG_ERR, "Accept failed. %s(%d)", strerror(errno), errno);
- continue;
- }
-
- switch (fork()) {
- case 0:
- break;
- case -1:
- syslog(LOG_ERR, "Fork failed. %s(%d)", strerror(errno), errno);
- default:
- close(nsk);
- if (type == MROUTER) {
- close(sk);
- terminate = 1;
- }
- continue;
- }
-
- close(sk);
-
- if (msdun && ms_dun(nsk, 1, msdun) < 0) {
- syslog(LOG_ERR, "MSDUN failed. %s(%d)", strerror(errno), errno);
- exit(0);
- }
-
- ba2str(&sa.rc_bdaddr, ba);
- sprintf(ch, "%d", channel);
-
- /* Setup environment */
- setenv("DUN_BDADDR", ba, 1);
- setenv("DUN_CHANNEL", ch, 1);
-
- if (!dun_open_connection(nsk, pppd, pppd_opts, 0))
- syslog(LOG_INFO, "New connection from %s", ba);
-
- close(nsk);
- exit(0);
- }
-
- if (use_sdp)
- dun_sdp_unregister();
- return 0;
-}
-
-/* Connect and initiate RFCOMM session
- * Returns:
- * -1 - critical error (exit persist mode)
- * 1 - non critical error
- * 0 - success
- */
-static int create_connection(char *dst, bdaddr_t *bdaddr, int mrouter)
-{
- struct sockaddr_rc sa;
- int sk, err = 0, ch;
-
- if (use_cache && cache.valid && cache.channel) {
- /* Use cached channel */
- ch = cache.channel;
-
- } else if (!channel) {
- syslog(LOG_INFO, "Searching for %s on %s", mrouter ? "SP" : "LAP", dst);
-
- if (dun_sdp_search(&src_addr, bdaddr, &ch, mrouter) <= 0)
- return 0;
- } else
- ch = channel;
-
- syslog(LOG_INFO, "Connecting to %s channel %d", dst, ch);
-
- sk = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
- if (sk < 0) {
- syslog(LOG_ERR, "Cannot create RFCOMM socket. %s(%d)",
- strerror(errno), errno);
- return -1;
- }
-
- sa.rc_family = AF_BLUETOOTH;
- sa.rc_channel = 0;
- sa.rc_bdaddr = src_addr;
-
- if (bind(sk, (struct sockaddr *) &sa, sizeof(sa)))
- syslog(LOG_ERR, "Bind failed. %s(%d)",
- strerror(errno), errno);
-
- sa.rc_channel = ch;
- sa.rc_bdaddr = *bdaddr;
-
- if (!connect(sk, (struct sockaddr *) &sa, sizeof(sa)) ) {
- if (mrouter) {
- sleep(1);
- close(sk);
- return 0;
- }
-
- syslog(LOG_INFO, "Connection established");
-
- if (msdun && ms_dun(sk, 0, msdun) < 0) {
- syslog(LOG_ERR, "MSDUN failed. %s(%d)", strerror(errno), errno);
- err = 1;
- goto out;
- }
-
- if (!dun_open_connection(sk, pppd, pppd_opts, (persist > 0)))
- err = 0;
- else
- err = 1;
- } else {
- syslog(LOG_ERR, "Connect to %s failed. %s(%d)",
- dst, strerror(errno), errno);
- err = 1;
- }
-
-out:
- if (use_cache) {
- if (!err) {
- /* Succesesful connection, validate cache */
- strcpy(cache.dst, dst);
- bacpy(&cache.bdaddr, bdaddr);
- cache.channel = ch;
- cache.valid = use_cache;
- } else {
- cache.channel = 0;
- cache.valid--;
- }
- }
-
- close(sk);
- return err;
-}
-
-/* Search and connect
- * Returns:
- * -1 - critical error (exit persist mode)
- * 1 - non critical error
- * 0 - success
- */
-static int do_connect(void)
-{
- inquiry_info *ii;
- int reconnect = 0;
- int i, n, r = 0;
-
- do {
- if (reconnect)
- sleep(persist);
- reconnect = 1;
-
- if (cache.valid) {
- /* Use cached bdaddr */
- r = create_connection(cache.dst, &cache.bdaddr, 0);
- if (r < 0) {
- terminate = 1;
- break;
- }
- continue;
- }
-
- syslog(LOG_INFO, "Inquiring");
-
- /* FIXME: Should we use non general LAP here ? */
-
- ii = NULL;
- n = hci_inquiry(src_dev, search_duration, 0, NULL, &ii, 0);
- if (n < 0) {
- syslog(LOG_ERR, "Inquiry failed. %s(%d)", strerror(errno), errno);
- continue;
- }
-
- for (i = 0; i < n; i++) {
- char dst[40];
- ba2str(&ii[i].bdaddr, dst);
-
- r = create_connection(dst, &ii[i].bdaddr, 0);
- if (r < 0) {
- terminate = 1;
- break;
- }
- }
- bt_free(ii);
- } while (!terminate && persist);
-
- return r;
-}
-
-static void do_show(void)
-{
- dun_show_connections();
-}
-
-static void do_kill(char *dst)
-{
- if (dst) {
- bdaddr_t ba;
- str2ba(dst, &ba);
- dun_kill_connection((void *) &ba);
- } else
- dun_kill_all_connections();
-}
-
-void sig_hup(int sig)
-{
- return;
-}
-
-void sig_term(int sig)
-{
- io_cancel();
- terminate = 1;
-}
-
-static struct option main_lopts[] = {
- { "help", 0, 0, 'h' },
- { "listen", 0, 0, 's' },
- { "connect", 1, 0, 'c' },
- { "search", 2, 0, 'Q' },
- { "kill", 1, 0, 'k' },
- { "killall", 0, 0, 'K' },
- { "channel", 1, 0, 'P' },
- { "device", 1, 0, 'i' },
- { "nosdp", 0, 0, 'D' },
- { "list", 0, 0, 'l' },
- { "show", 0, 0, 'l' },
- { "nodetach", 0, 0, 'n' },
- { "persist", 2, 0, 'p' },
- { "auth", 0, 0, 'A' },
- { "encrypt", 0, 0, 'E' },
- { "secure", 0, 0, 'S' },
- { "master", 0, 0, 'M' },
- { "cache", 0, 0, 'C' },
- { "pppd", 1, 0, 'd' },
- { "msdun", 2, 0, 'X' },
- { "activesync", 0, 0, 'a' },
- { "mrouter", 1, 0, 'm' },
- { "dialup", 0, 0, 'u' },
- { 0, 0, 0, 0 }
-};
-
-static char main_sopts[] = "hsc:k:Kr:i:lnp::DQ::AESMP:C::P:Xam:u";
-
-static char main_help[] =
- "Bluetooth LAP (LAN Access over PPP) daemon version " VERSION " \n"
- "Usage:\n"
- "\tdund <options> [pppd options]\n"
- "Options:\n"
- "\t--show --list -l Show active LAP connections\n"
- "\t--listen -s Listen for LAP connections\n"
- "\t--dialup -u Pretend to be a dialup/telephone\n"
- "\t--connect -c <bdaddr> Create LAP connection\n"
- "\t--mrouter -m <bdaddr> Create mRouter connection\n"
- "\t--search -Q[duration] Search and connect\n"
- "\t--kill -k <bdaddr> Kill LAP connection\n"
- "\t--killall -K Kill all LAP connections\n"
- "\t--channel -P <channel> RFCOMM channel\n"
- "\t--device -i <bdaddr> Source bdaddr\n"
- "\t--nosdp -D Disable SDP\n"
- "\t--auth -A Enable authentication\n"
- "\t--encrypt -E Enable encryption\n"
- "\t--secure -S Secure connection\n"
- "\t--master -M Become the master of a piconet\n"
- "\t--nodetach -n Do not become a daemon\n"
- "\t--persist -p[interval] Persist mode\n"
- "\t--pppd -d <pppd> Location of the PPP daemon (pppd)\n"
- "\t--msdun -X[timeo] Enable Microsoft dialup networking support\n"
- "\t--activesync -a Enable Microsoft ActiveSync networking\n"
- "\t--cache -C[valid] Enable address cache\n";
-
-int main(int argc, char *argv[])
-{
- char *dst = NULL, *src = NULL;
- struct sigaction sa;
- int mode = NONE;
- int opt;
-
- while ((opt=getopt_long(argc, argv, main_sopts, main_lopts, NULL)) != -1) {
- switch(opt) {
- case 'l':
- mode = SHOW;
- detach = 0;
- break;
-
- case 's':
- mode = LISTEN;
- type = LANACCESS;
- break;
-
- case 'c':
- mode = CONNECT;
- dst = strdup(optarg);
- break;
-
- case 'Q':
- mode = CONNECT;
- dst = NULL;
- if (optarg)
- search_duration = atoi(optarg);
- break;
-
- case 'k':
- mode = KILL;
- detach = 0;
- dst = strdup(optarg);
- break;
-
- case 'K':
- mode = KILL;
- detach = 0;
- dst = NULL;
- break;
-
- case 'P':
- channel = atoi(optarg);
- break;
-
- case 'i':
- src = strdup(optarg);
- break;
-
- case 'D':
- use_sdp = 0;
- break;
-
- case 'A':
- auth = 1;
- break;
-
- case 'E':
- encrypt = 1;
- break;
-
- case 'S':
- secure = 1;
- break;
-
- case 'M':
- master = 1;
- break;
-
- case 'n':
- detach = 0;
- break;
-
- case 'p':
- if (optarg)
- persist = atoi(optarg);
- else
- persist = 5;
- break;
-
- case 'C':
- if (optarg)
- use_cache = atoi(optarg);
- else
- use_cache = 2;
- break;
-
- case 'd':
- pppd = strdup(optarg);
- break;
-
- case 'X':
- if (optarg)
- msdun = atoi(optarg);
- else
- msdun = 10;
- break;
-
- case 'a':
- msdun = 10;
- type = ACTIVESYNC;
- break;
-
- case 'm':
- mode = LISTEN;
- dst = strdup(optarg);
- type = MROUTER;
- break;
-
- case 'u':
- mode = LISTEN;
- type = DIALUP;
- break;
-
- case 'h':
- default:
- printf(main_help);
- exit(0);
- }
- }
-
- argc -= optind;
- argv += optind;
-
- /* The rest is pppd options */
- if (argc > 0) {
- for (opt = 3; argc && opt < DUN_MAX_PPP_OPTS; argc--, opt++)
- pppd_opts[opt] = *argv++;
- pppd_opts[opt] = NULL;
- }
-
- io_init();
-
- if (dun_init())
- return -1;
-
- /* Check non daemon modes first */
- switch (mode) {
- case SHOW:
- do_show();
- return 0;
-
- case KILL:
- do_kill(dst);
- return 0;
-
- case NONE:
- printf(main_help);
- return 0;
- }
-
- /* Initialize signals */
- memset(&sa, 0, sizeof(sa));
- sa.sa_flags = SA_NOCLDSTOP;
- sa.sa_handler = SIG_IGN;
- sigaction(SIGCHLD, &sa, NULL);
- sigaction(SIGPIPE, &sa, NULL);
-
- sa.sa_handler = sig_term;
- sigaction(SIGTERM, &sa, NULL);
- sigaction(SIGINT, &sa, NULL);
-
- sa.sa_handler = sig_hup;
- sigaction(SIGHUP, &sa, NULL);
-
- if (detach && daemon(0, 0)) {
- perror("Can't start daemon");
- exit(1);
- }
-
- openlog("dund", LOG_PID | LOG_NDELAY | LOG_PERROR, LOG_DAEMON);
- syslog(LOG_INFO, "Bluetooth DUN daemon version %s", VERSION);
-
- if (src) {
- src_dev = hci_devid(src);
- if (src_dev < 0 || hci_devba(src_dev, &src_addr) < 0) {
- syslog(LOG_ERR, "Invalid source. %s(%d)", strerror(errno), errno);
- return -1;
- }
- }
-
- if (dst) {
- strncpy(cache.dst, dst, sizeof(cache.dst) - 1);
- str2ba(dst, &cache.bdaddr);
-
- /* Disable cache invalidation */
- use_cache = cache.valid = ~0;
- }
-
- switch (mode) {
- case CONNECT:
- do_connect();
- break;
-
- case LISTEN:
- do_listen();
- break;
- }
-
- return 0;
-}
diff --git a/dund/msdun.c b/dund/msdun.c
deleted file mode 100644
index 1ef559f1..00000000
--- a/dund/msdun.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- *
- * BlueZ - Bluetooth protocol stack for Linux
- *
- * Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
- * Copyright (C) 2002-2008 Marcel Holtmann <marcel@holtmann.org>
- *
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <syslog.h>
-#include <setjmp.h>
-#include <string.h>
-
-#include "lib.h"
-
-#define MS_PPP 2
-#define MS_SUCCESS 1
-#define MS_FAILED -1
-#define MS_TIMEOUT -2
-
-static sigjmp_buf jmp;
-static int retry;
-static int timeout;
-
-static void sig_alarm(int sig)
-{
- siglongjmp(jmp, MS_TIMEOUT);
-}
-
-static int w4_str(int fd, char *str)
-{
- char buf[40];
- int r, len = 0;
-
- while (1) {
- r = read(fd, buf + len, sizeof(buf) - len - 1);
- if (r < 0) {
- if (errno == EINTR || errno == EAGAIN)
- continue;
- break;
- }
- if (!r)
- break;
-
- len += r;
-
- if (len < strlen(str))
- continue;
- buf[len] = 0;
-
- if (strstr(buf, str))
- return MS_SUCCESS;
-
- /* Detect PPP */
- if (strchr(buf, '~'))
- return MS_PPP;
- }
- return MS_FAILED;
-}
-
-static int ms_server(int fd)
-{
- switch (w4_str(fd, "CLIENT")) {
- case MS_SUCCESS:
- write_n(fd, "CLIENTSERVER", 12);
- case MS_PPP:
- return MS_SUCCESS;
- default:
- return MS_FAILED;
- }
-}
-
-static int ms_client(int fd)
-{
- write_n(fd, "CLIENT", 6);
- return w4_str(fd, "CLIENTSERVER");
-}
-
-int ms_dun(int fd, int server, int timeo)
-{
- sig_t osig;
-
- retry = 4;
- timeout = timeo;
-
- if (!server)
- timeout /= retry;
-
- osig = signal(SIGALRM, sig_alarm);
-
- while (1) {
- int r = sigsetjmp(jmp, 1);
- if (r) {
- if (r == MS_TIMEOUT && !server && --retry)
- continue;
-
- alarm(0);
- signal(SIGALRM, osig);
-
- switch (r) {
- case MS_SUCCESS:
- case MS_PPP:
- errno = 0;
- return 0;
-
- case MS_FAILED:
- errno = EPROTO;
- break;
-
- case MS_TIMEOUT:
- errno = ETIMEDOUT;
- break;
- }
- return -1;
- }
-
- alarm(timeout);
-
- if (server)
- r = ms_server(fd);
- else
- r = ms_client(fd);
-
- siglongjmp(jmp, r);
- }
-}
diff --git a/dund/sdp.c b/dund/sdp.c
deleted file mode 100644
index f2c42c5a..00000000
--- a/dund/sdp.c
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- *
- * BlueZ - Bluetooth protocol stack for Linux
- *
- * Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
- * Copyright (C) 2002-2008 Marcel Holtmann <marcel@holtmann.org>
- *
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <bluetooth/bluetooth.h>
-#include <bluetooth/sdp.h>
-#include <bluetooth/sdp_lib.h>
-
-#include "dund.h"
-
-static unsigned char async_uuid[] = { 0x03, 0x50, 0x27, 0x8F, 0x3D, 0xCA, 0x4E, 0x62,
- 0x83, 0x1D, 0xA4, 0x11, 0x65, 0xFF, 0x90, 0x6C };
-
-static sdp_record_t *record;
-static sdp_session_t *session;
-
-void dun_sdp_unregister(void)
-{
- if (record && sdp_record_unregister(session, record))
- syslog(LOG_ERR, "Service record unregistration failed.");
- sdp_close(session);
-}
-
-int dun_sdp_register(bdaddr_t *device, uint8_t channel, int type)
-{
- sdp_list_t *svclass, *pfseq, *apseq, *root, *aproto;
- uuid_t root_uuid, l2cap, rfcomm, dun;
- sdp_profile_desc_t profile[1];
- sdp_list_t *proto[2];
- int status;
-
- session = sdp_connect(BDADDR_ANY, BDADDR_LOCAL, 0);
- if (!session) {
- syslog(LOG_ERR, "Failed to connect to the local SDP server. %s(%d)",
- strerror(errno), errno);
- return -1;
- }
-
- record = sdp_record_alloc();
- if (!record) {
- syslog(LOG_ERR, "Failed to alloc service record");
- return -1;
- }
-
- sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
- root = sdp_list_append(NULL, &root_uuid);
- sdp_set_browse_groups(record, root);
-
- sdp_uuid16_create(&l2cap, L2CAP_UUID);
- proto[0] = sdp_list_append(NULL, &l2cap);
- apseq = sdp_list_append(NULL, proto[0]);
-
- sdp_uuid16_create(&rfcomm, RFCOMM_UUID);
- proto[1] = sdp_list_append(NULL, &rfcomm);
- proto[1] = sdp_list_append(proto[1], sdp_data_alloc(SDP_UINT8, &channel));
- apseq = sdp_list_append(apseq, proto[1]);
-
- aproto = sdp_list_append(NULL, apseq);
- sdp_set_access_protos(record, aproto);
-
- switch (type) {
- case MROUTER:
- sdp_uuid16_create(&dun, SERIAL_PORT_SVCLASS_ID);
- break;
- case ACTIVESYNC:
- sdp_uuid128_create(&dun, (void *) async_uuid);
- break;
- case DIALUP:
- sdp_uuid16_create(&dun, DIALUP_NET_SVCLASS_ID);
- break;
- default:
- sdp_uuid16_create(&dun, LAN_ACCESS_SVCLASS_ID);
- break;
- }
-
- svclass = sdp_list_append(NULL, &dun);
- sdp_set_service_classes(record, svclass);
-
- switch (type) {
- case LANACCESS:
- sdp_uuid16_create(&profile[0].uuid, LAN_ACCESS_PROFILE_ID);
- profile[0].version = 0x0100;
- pfseq = sdp_list_append(NULL, &profile[0]);
- sdp_set_profile_descs(record, pfseq);
- break;
- case DIALUP:
- sdp_uuid16_create(&profile[0].uuid, DIALUP_NET_PROFILE_ID);
- profile[0].version = 0x0100;
- pfseq = sdp_list_append(NULL, &profile[0]);
- sdp_set_profile_descs(record, pfseq);
- break;
- }
-
- switch (type) {
- case MROUTER:
- sdp_set_info_attr(record, "mRouter", NULL, NULL);
- break;
- case ACTIVESYNC:
- sdp_set_info_attr(record, "ActiveSync", NULL, NULL);
- break;
- case DIALUP:
- sdp_set_info_attr(record, "Dialup Networking", NULL, NULL);
- break;
- default:
- sdp_set_info_attr(record, "LAN Access Point", NULL, NULL);
- break;
- }
-
- status = sdp_device_record_register(session, device, record, 0);
- if (status) {
- syslog(LOG_ERR, "SDP registration failed.");
- sdp_record_free(record);
- record = NULL;
- return -1;
- }
- return 0;
-}
-
-int dun_sdp_search(bdaddr_t *src, bdaddr_t *dst, int *channel, int type)
-{
- sdp_session_t *s;
- sdp_list_t *srch, *attrs, *rsp;
- uuid_t svclass;
- uint16_t attr;
- int err;
-
- s = sdp_connect(src, dst, 0);
- if (!s) {
- syslog(LOG_ERR, "Failed to connect to the SDP server. %s(%d)",
- strerror(errno), errno);
- return -1;
- }
-
- switch (type) {
- case MROUTER:
- sdp_uuid16_create(&svclass, SERIAL_PORT_SVCLASS_ID);
- break;
- case ACTIVESYNC:
- sdp_uuid128_create(&svclass, (void *) async_uuid);
- break;
- case DIALUP:
- sdp_uuid16_create(&svclass, DIALUP_NET_SVCLASS_ID);
- break;
- default:
- sdp_uuid16_create(&svclass, LAN_ACCESS_SVCLASS_ID);
- break;
- }
-
- srch = sdp_list_append(NULL, &svclass);
-
- attr = SDP_ATTR_PROTO_DESC_LIST;
- attrs = sdp_list_append(NULL, &attr);
-
- err = sdp_service_search_attr_req(s, srch, SDP_ATTR_REQ_INDIVIDUAL, attrs, &rsp);
-
- sdp_close(s);
-
- if (err)
- return 0;
-
- for(; rsp; rsp = rsp->next) {
- sdp_record_t *rec = (sdp_record_t *) rsp->data;
- sdp_list_t *protos;
-
- if (!sdp_get_access_protos(rec, &protos)) {
- int ch = sdp_get_proto_port(protos, RFCOMM_UUID);
- if (ch > 0) {
- *channel = ch;
- return 1;
- }
- }
- }
-
- return 0;
-}