diff options
Diffstat (limited to 'src/libgsmd')
| -rw-r--r-- | src/libgsmd/lgsm_internals.h | 4 | ||||
| -rw-r--r-- | src/libgsmd/libgsmd.c | 69 | ||||
| -rw-r--r-- | src/libgsmd/libgsmd_input.c | 13 | ||||
| -rw-r--r-- | src/libgsmd/libgsmd_voicecall.c | 24 | 
4 files changed, 110 insertions, 0 deletions
diff --git a/src/libgsmd/lgsm_internals.h b/src/libgsmd/lgsm_internals.h new file mode 100644 index 0000000..66fd5fe --- /dev/null +++ b/src/libgsmd/lgsm_internals.h @@ -0,0 +1,4 @@ + +struct lgsm_handle { +	int fd; +}; diff --git a/src/libgsmd/libgsmd.c b/src/libgsmd/libgsmd.c new file mode 100644 index 0000000..e514617 --- /dev/null +++ b/src/libgsmd/libgsmd.c @@ -0,0 +1,69 @@ + +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/un.h> + +#include <libgsmd/libgsmd.h> + +#include "lgsm_internals.h" + +static int lgsm_open_backend(struct lgsm_handle *lh, const char *device) +{ +	int rc; + +	if (!strcmp(device, "gsmd")) { +		struct sockaddr_un sun; +		 +		/* use unix domain socket to gsm daemon */ +		lh->fd = socket(PF_UNIX, GSMD_UNIX_SOCKET_TYPE, 0); +		if (lh->fd < 0) +			return lh->fd; +		 +		sun.sun_family = AF_UNIX; +		memcpy(sun.sun_path, GSMD_UNIX_SOCKET, sizeof(GSMD_UNIX_SOCKET)); + +		rc = connect(lh->fd, (struct sockaddr *)&sun, sizeof(sun)); +		if (rc < 0) { +			close(lh->fd); +			lh->fd = -1; +			return rc; +		} +	} else { +		/* use direct access to device node ([virtual] tty device) */ +		lh->fd = open(device, O_RDWR); +		if (lh->fd < 0) +			return lh->fd; +	} +	 +	return 0; +} + +struct lgsm_handle *lgsm_init(const char *device) +{ +	struct lgsm_handle *lh = malloc(sizeof(*lh)); + +	memset(lh, 0, sizeof(*lh)); +	lh->fd = -1; + +	if (lgsm_open_backend(lh, device) < 0) { +		free(lh); +		return NULL; +	} + +	/* send some initial commands, such as ATV1 (verbose response) +	 * and +CRC=1 (which we currently require!) */ + +	return lh; +} + +int lgsm_exit(struct lgsm_handle *lh) +{ +	free(lh); + +	return 0; +} diff --git a/src/libgsmd/libgsmd_input.c b/src/libgsmd/libgsmd_input.c new file mode 100644 index 0000000..134cfea --- /dev/null +++ b/src/libgsmd/libgsmd_input.c @@ -0,0 +1,13 @@ + +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include <sys/types.h> + +#include <libgsmd/libgsmd.h> + +#include "lgsm_internals.h" + + diff --git a/src/libgsmd/libgsmd_voicecall.c b/src/libgsmd/libgsmd_voicecall.c new file mode 100644 index 0000000..f59bdff --- /dev/null +++ b/src/libgsmd/libgsmd_voicecall.c @@ -0,0 +1,24 @@ + + +#include <libgsmd/voicecall.h> + +#include "libgsmd/internals.h" + + +int lgsm_voice_out_init(struct lgsm_handle *lh, +			const struct lgsm_addr *number) +{ +	/* send ATD command */ +	return -EINVAL; +} + +int lgsm_voice_in_accept(struct lgsm_handle *lh) +{ +	return -EINVAL; +} + +int lgsm_voice_hangup(struct lgsm_handle *lh) +{ +	/* Send ATH0 */ +	return -EINVAL; +}  | 
