diff options
author | Max Krasnyansky <maxk@qualcomm.com> | 2002-03-08 21:12:35 +0000 |
---|---|---|
committer | Max Krasnyansky <maxk@qualcomm.com> | 2002-03-08 21:12:35 +0000 |
commit | c98b2f82a4e532ca61592b08e3ad60749eb9f8d7 (patch) | |
tree | 19a3df72d2cd6a8d64b7d98473261c7e07e306a0 /hcid/lib.c |
Initial revision
Diffstat (limited to 'hcid/lib.c')
-rw-r--r-- | hcid/lib.c | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/hcid/lib.c b/hcid/lib.c new file mode 100644 index 00000000..ac47603d --- /dev/null +++ b/hcid/lib.c @@ -0,0 +1,171 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM, + OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE + USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS, + TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED. +*/ +/* + * $Id$ + */ + +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <stdarg.h> +#include <unistd.h> +#include <netdb.h> +#include <signal.h> + +#include "hcid.h" +#include "lib.h" + +volatile sig_atomic_t __io_canceled; + +/* + * Device name expansion + * %d - device id + */ +char * expand_name(char *dst, char *str, int dev_id) +{ + register int sp, np, olen; + char *opt, buf[10]; + + if (!str && !dst) + return NULL; + + sp = np = 0; + while (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); + 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); +} |