⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 btftp.c

📁 affix是一个Open Source的蓝牙协议栈
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -