/* * * BlueZ - Bluetooth protocol stack for Linux * * Copyright (C) 2000-2001 Qualcomm Incorporated * Copyright (C) 2002-2003 Maxim Krasnyansky * Copyright (C) 2002-2005 Marcel Holtmann * * * 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 #endif #include #include #include #include #include #include #include #include #include #include #include #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); }