| /* |
| * |
| * BlueZ - Bluetooth protocol stack for Linux |
| * |
| * Copyright (C) 2000-2001 Qualcomm Incorporated |
| * Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com> |
| * Copyright (C) 2002-2005 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 <stdarg.h> |
| #include <string.h> |
| #include <signal.h> |
| #include <sys/socket.h> |
| |
| #include <bluetooth/bluetooth.h> |
| #include <bluetooth/hci.h> |
| #include <bluetooth/hci_lib.h> |
| |
| #include "hcid.h" |
| #include "lib.h" |
| |
| volatile sig_atomic_t __io_canceled; |
| |
| /* |
| * Device name expansion |
| * %d - device id |
| */ |
| char *expand_name(char *dst, int size, char *str, int dev_id) |
| { |
| register int sp, np, olen; |
| char *opt, buf[10]; |
| |
| if (!str && !dst) |
| return NULL; |
| |
| sp = np = 0; |
| while (np < size - 1 && str[sp]) { |
| switch (str[sp]) { |
| case '%': |
| opt = NULL; |
| |
| switch (str[sp+1]) { |
| case 'd': |
| sprintf(buf, "%d", dev_id); |
| opt = buf; |
| break; |
| |
| case 'h': |
| opt = hcid.host_name; |
| break; |
| |
| case '%': |
| dst[np++] = str[sp++]; |
| /* fall through */ |
| default: |
| sp++; |
| continue; |
| } |
| |
| if (opt) { |
| /* substitute */ |
| olen = strlen(opt); |
| if (np + olen < size - 1) |
| memcpy(dst + np, opt, olen); |
| np += olen; |
| } |
| sp += 2; |
| continue; |
| |
| case '\\': |
| sp++; |
| /* fall through */ |
| default: |
| dst[np++] = str[sp++]; |
| break; |
| } |
| } |
| dst[np] = '\0'; |
| return dst; |
| } |
| |
| /* Returns current host name */ |
| char *get_host_name(void) |
| { |
| char name[40]; |
| |
| if (!gethostname(name, sizeof(name)-1)) { |
| name[sizeof(name)-1] = 0; |
| return strdup(name); |
| } |
| return strdup("noname"); |
| } |
| |
| /* Functions to manipulate program title */ |
| extern char **environ; |
| char *title_start; /* start of the proc title space */ |
| char *title_end; /* end of the proc title space */ |
| int title_size; |
| |
| void init_title(int argc, char *argv[], char *envp[], const char *name) |
| { |
| int i; |
| |
| /* |
| * Move the environment so settitle can use the space at |
| * the top of memory. |
| */ |
| |
| for (i = 0; envp[i]; i++); |
| |
| environ = (char **) malloc(sizeof (char *) * (i + 1)); |
| |
| for (i = 0; envp[i]; i++) |
| environ[i] = strdup(envp[i]); |
| environ[i] = NULL; |
| |
| /* |
| * Save start and extent of argv for set_title. |
| */ |
| |
| title_start = argv[0]; |
| |
| /* |
| * Determine how much space we can use for set_title. |
| * Use all contiguous argv and envp pointers starting at argv[0] |
| */ |
| for (i =0; i < argc; i++) |
| if (!i || title_end == argv[i]) |
| title_end = argv[i] + strlen(argv[i]) + 1; |
| |
| for (i = 0; envp[i]; i++) |
| if (title_end == envp[i]) |
| title_end = envp[i] + strlen(envp[i]) + 1; |
| |
| strcpy(title_start, name); |
| title_start += strlen(name); |
| title_size = title_end - title_start; |
| } |
| |
| void set_title(const char *fmt, ...) |
| { |
| char buf[255]; |
| va_list ap; |
| |
| memset(title_start, 0, title_size); |
| |
| /* print the argument string */ |
| va_start(ap, fmt); |
| vsprintf(buf, fmt, ap); |
| va_end(ap); |
| |
| if (strlen(buf) > title_size - 1) |
| buf[title_size - 1] = '\0'; |
| |
| strcat(title_start, buf); |
| } |