📄 btftp.c
字号:
if (!promptmode) { err = obex_setaddress(); if (err) { printf("Address error\n"); return 1; } if (__argv[optind] == NULL) { printf("No file name.\n"); return 1; } handle = obex_connect((struct sockaddr_affix*)&saddr, target, &err); if (handle == NULL) { fprintf(stderr, "Connection failed: %s\n", obex_error(err)); return err; } } err = _cmd_put(cmd); if (!promptmode) { obex_disconnect(handle); } return err;}int cmd_get(struct command *cmd){ int err; if (!promptmode) { err = obex_setaddress(); if (err) { printf("Address error\n"); return 1; } if (__argv[optind] == NULL) { printf("No file name\n"); return 1; } handle = obex_connect((struct sockaddr_affix*)&saddr, target, &err); if (handle == NULL) { fprintf(stderr, "Connection failed: %s\n", obex_error(err)); return err; } } err = _cmd_get(cmd); if (!promptmode) { obex_disconnect(handle); } return err;}int cmd_push(struct command *cmd){ int err; if (!promptmode) { do_push = 1; err = obex_setaddress(); if (err) { printf("Address error\n"); return -1; } do_push = 0; if (__argv[optind] == NULL) { printf("No file name\n"); return 1; } handle = obex_connect((struct sockaddr_affix*)&saddr, target, &err); if (handle == NULL) { fprintf(stderr, "Connection failed: %s\n", obex_error(err)); return err; } } err = _cmd_push(cmd); if (!promptmode) { obex_disconnect(handle); } return err;}int cmd_rm(struct command *cmd){ int err; if (!promptmode) { err = obex_setaddress(); if (err) { printf("Address error\n"); return 1; } if (__argv[optind] == NULL) { printf("No file name\n"); return 1; } handle = obex_connect((struct sockaddr_affix*)&saddr, target, &err); if (handle == NULL) { fprintf(stderr, "Connection failed: %s\n", obex_error(err)); return err; } } err = _cmd_rm(cmd); if (!promptmode) { obex_disconnect(handle); } return err;}int cmd_cd(struct command *cmd){ int err; if (!promptmode) { printf("Command available only in FTP mode.\n"); return -1; } err = _cmd_cd(cmd); return err;}int cmd_mkdir(struct command *cmd){ int err; if (!promptmode) { printf("Command available only in FTP mode.\n"); return -1; } err = _cmd_mkdir(cmd); return err;}/* Command line mode */static inline int white_space(char c){ return (c == ' ' || c == '\t');}static inline int end_line(char c){ return (c == '\n' || c == '\0');}static inline char *find_non_white(char *str){ while (white_space(*str)) str++; return (!end_line(*str)?str:NULL);}static inline char *find_white(char *str){ while (!end_line(*str) && !white_space(*str)) str++; return str;}static inline char *find_char(char *str, char c){ while (*str && *str != c) str++; return (*str?str:NULL);}char *get_string(char **str){ char *first, *next; int quotes = 0; if (*str == NULL) return NULL; first = find_non_white(*str); if (first == NULL) return NULL; if (*first == '"') { quotes = 1; first++; } next = first; if (quotes) { next = find_char(next, '"'); if (!next) { fprintf(stderr, "parse error\n"); return NULL; } *next = '\0'; next++; } else { next = find_white(next); if (*next) { *next = '\0'; next++; } } if (*next) next = find_non_white(next); *str = next; return first;}char **parse_command_line(char *str){ static char *argv[32]; // for 32 arguments char *arg; int i; argv[0] = __argv[0]; for (i = 1; (arg = get_string(&str)) ; i++) { argv[i] = arg; //printf("__argv[%d]: %s\n", i, arg); } argv[i] = NULL; __argc = i; if (i > 1) { __argv = argv; optind = 2; return __argv + 1; } return NULL;}static void signal_handler(int sig){ //BTINFO("Sig handler : %d", sig); if (sig == SIGINT) { printf("\n"); siglongjmp(sigj, 0); } printf("Terminating on signal (%d) ...\n", sig); exit(0);}#if 0 len = getline(&lineread, &size, stdin); if (len == -1 || !lineread) {err: INTON; return NULL; }#endif int run_prompt(char *prompt, struct command *cmds){#ifndef HAVE_READLINE_READLINE_H size_t size; ssize_t len;#endif char *str = NULL, **cmd; int err; promptmode = 1; /* install signal handlers to unregister services from SDP */ signal(SIGCHLD, SIG_IGN); signal(SIGINT, signal_handler); // CTRL-C signal(SIGTERM, signal_handler); for (;;) { sigsetjmp(sigj, 1); free(command); command = NULL; free(str); str = NULL;#ifdef HAVE_READLINE_READLINE_H str = readline(prompt); if (!str) break; if (str[0]) add_history(str);#else printf(prompt); // get a line len = getline(&str, &size, stdin); if (len == -1 || !str) break;#endif command = strdup(str); //printf("got: %s, len: %d\n", str, strlen(str)); if (str[0] == '!') { if (str[1] == '\0') err = system("/bin/sh -l"); else err = system(str+1); continue; } cmd = parse_command_line(str); if (cmd == NULL) continue; if (strcasecmp(*cmd, "quit") == 0) { printf("Bye!!!\n"); break; } else if (strcasecmp(*cmd, "mode") == 0) { if (__argv[optind]) { if (strcasecmp(__argv[optind], "tcp") == 0) linkmode = PF_INET; else linkmode = PF_AFFIX; } printf("Mode: %s\n", linkmode == PF_INET ? "TCP" : "Bluetooth"); } else if (strcasecmp(*cmd, "?") == 0) { print_all_usage(cmds); } else { err = call_command(cmds, *cmd); } } free(str); return 0;}int cmd_client(struct command *cmd){ char __cmd[256]; char *ch; strcpy(__cmd, progname); ch = strrchr(__cmd, '/'); if (ch) *(ch + 1) = '\0'; else __cmd[0] = '\0'; strcat(__cmd, "btclt "); strcat(__cmd, command); return system(__cmd);}int cmd_help(struct command *cmd){ if (!__argv[optind]) { print_usage(cmd); return 0; } return print_command_usage(cmds, __argv[optind]);}void usage(void){ printf("Usage: btftp [-i <name>] [<command> [parameters..]>\n"); print_all_usage(cmds); printf("\n" "Notes:\n" "\t1. *address* argument can be replaced by cache entry number (btctl list)\n" "\t2. *--nosdp* option required to manually define server channel\n" "\t3. use *search* command if *browse* returns nothing\n" "\t4. argument *channel* is not used in SDP mode\n" "\t5. arguments *address* and *channel* are not used with\n" "\t commands: *ls*, *get*, *put*, *rm* in FTP (prompt) mode\n" "\n" );}int cmd_prompt(struct command *_cmd){ int err; printf("Affix version: %s\n", affix_version); printf("Welcome to btftp (OBEX) tool. Type ? for help.\n"); printf("Mode: %s\n", linkmode == PF_INET ? "TCP" : "Bluetooth"); err = run_prompt("ftp> ", cmds); printf("Terminating ...\n"); return err;}struct command cmds[] = { {0, 0, 0, 0, "---->>>> General commands <<<<----\n"}, {"help", cmd_help, 0, "<command name>"}, {"list", cmd_client, 0, "", "shows know/found devices\n"}, {"flush", cmd_client, 1, "", "removes all know devices from the cache\n"}, {"inquiry", cmd_client, 2, "[length]", "search for the device\n" }, {"discovery", cmd_client, 3, "[length]","search for the devices and resolve their names\n"}, {"browse", cmd_client, 4, "<address>", "browse for services on remote device\n"}, {"search", cmd_client, 5, "<address>", "search for services on remote device\n" "notes: used if browse does not find anything, because\n" "some devices does not suport browseing\n" }, /* OBEX */ {0, 0, 0, 0, "---->>>> OBEX commands <<<<----\n"}, {"ftp", cmd_prompt, 0, "", "enter interactive mode\n" }, {"open", cmd_open, 0, "<address> [<channel>]", "open connection to obex ftp server\n" }, {"close", cmd_close, 0, "", "close connection to obex ftp server\n" }, {"ls", cmd_ls, 0, "[<address> [<channel>]]" }, {"put", cmd_put, 0, "[<address> [<channel>]] <local-file> [remote-file]" }, {"get", cmd_get, 0, "[<address> [<channel>]] <remote-file> [local-file]" }, {"push", cmd_push, 0, "<address> [<channel>] <local-file> [remote-file]" }, {"rm", cmd_rm, 0, "[<address> [<channel>]] <remote-file>" }, {"cd", cmd_cd, 0, "<dir name>" }, {"mkdir", cmd_mkdir, 0, "<dir name>" }, {0, 0, 0, NULL}};//int cmdnum = sizeof(cmds)/sizeof(cmds[0]);void do_exit(void){ if (promptmode) cmd_close(0);}int main(int argc, char **argv){ int c, lind, i, err = 0; struct option opts[] = { {"help", 0, 0, 'h'}, {"tcp", 0, 0, 't'}, {"nosdp", 0, 0, 's'}, {"version", 0, 0, 'V'}, {0, 0, 0, 0} }; if (affix_init(argc, argv, LOG_USER)) { fprintf(stderr, "Affix initialization failed\n"); return 1; } atexit(do_exit); for (;;) { c = getopt_long(argc, __argv, "+htvsVi:", opts, &lind); if (c == -1) break; switch (c) { case 'h': usage(); return 0; break; case 'v': verboseflag = 1; break; case 'i': strncpy(btdev, optarg, IFNAMSIZ); break; case 't': linkmode = PF_INET; break; case 'V': printf("Affix version: %s\n", affix_version); return 0; break; case ':': printf("Missing parameters for option: %c\n", optopt); return 1; break; case '?': printf("Unknown option: %c\n", optopt); return 1; break; } } if (__argv[optind] && sscanf(__argv[optind], "bt%d", &i) > 0) { /* interface name */ sprintf(btdev, "bt%d", i); optind++; } if (__argv[optind] == NULL) { err = cmd_prompt(NULL); goto exit; } err = call_command(cmds, __argv[optind++]);exit: return err;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -