Skip to content
Snippets Groups Projects
cli.c 28.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • Mark Spencer's avatar
    Mark Spencer committed
    	return (match_list);
    }
    
    
    Mark Spencer's avatar
    Mark Spencer committed
    static char *__ast_cli_generator(char *text, char *word, int state, int lock)
    
    Mark Spencer's avatar
    Mark Spencer committed
    {
    	char *argv[AST_MAX_ARGS];
    	struct ast_cli_entry *e, *e1, *e2;
    	int x;
    	int matchnum=0;
    	char *dup, *res;
    	char fullcmd1[80];
    	char fullcmd2[80];
    	char matchstr[80];
    	char *fullcmd;
    
    	if ((dup = parse_args(text, &x, argv))) {
    		join(matchstr, sizeof(matchstr), argv);
    
    Mark Spencer's avatar
    Mark Spencer committed
    		if (lock)
    
    Mark Spencer's avatar
    Mark Spencer committed
    		e1 = builtins;
    		e2 = helpers;
    		while(e1->cmda[0] || e2) {
    			if (e2)
    				join(fullcmd2, sizeof(fullcmd2), e2->cmda);
    			if (e1->cmda[0])
    				join(fullcmd1, sizeof(fullcmd1), e1->cmda);
    
    Mark Spencer's avatar
    Mark Spencer committed
    			if (!e1->cmda[0] || 
    
    Mark Spencer's avatar
    Mark Spencer committed
    					(e2 && (strcmp(fullcmd2, fullcmd1) < 0))) {
    				/* Use e2 */
    				e = e2;
    				fullcmd = fullcmd2;
    				/* Increment by going to next */
    				e2 = e2->next;
    			} else {
    				/* Use e1 */
    				e = e1;
    				fullcmd = fullcmd1;
    				e1++;
    			}
    
    			if ((fullcmd[0] != '_') && !strncasecmp(matchstr, fullcmd, strlen(matchstr))) {
    
    Mark Spencer's avatar
    Mark Spencer committed
    				/* We contain the first part of one or more commands */
    				matchnum++;
    				if (matchnum > state) {
    					/* Now, what we're supposed to return is the next word... */
    
    					if (!ast_strlen_zero(word) && x>0) {
    
    Mark Spencer's avatar
    Mark Spencer committed
    						res = e->cmda[x-1];
    					} else {
    						res = e->cmda[x];
    					}
    					if (res) {
    
    Mark Spencer's avatar
    Mark Spencer committed
    						if (lock)
    
    						return res ? strdup(res) : NULL;
    
    Mark Spencer's avatar
    Mark Spencer committed
    					}
    				}
    			}
    			if (e->generator && !strncasecmp(matchstr, fullcmd, strlen(fullcmd))) {
    				/* We have a command in its entirity within us -- theoretically only one
    				   command can have this occur */
    
    				fullcmd = e->generator(matchstr, word, (!ast_strlen_zero(word) ? (x - 1) : (x)), state);
    
    Mark Spencer's avatar
    Mark Spencer committed
    				if (lock)
    
    James Golovich's avatar
    James Golovich committed
    				free(dup);
    
    Mark Spencer's avatar
    Mark Spencer committed
    				return fullcmd;
    			}
    			
    		}
    
    Mark Spencer's avatar
    Mark Spencer committed
    		if (lock)
    
    Mark Spencer's avatar
    Mark Spencer committed
    		free(dup);
    	}
    	return NULL;
    }
    
    
    Mark Spencer's avatar
    Mark Spencer committed
    char *ast_cli_generator(char *text, char *word, int state)
    {
    	return __ast_cli_generator(text, word, state, 1);
    }
    
    
    Mark Spencer's avatar
    Mark Spencer committed
    int ast_cli_command(int fd, char *s)
    {
    	char *argv[AST_MAX_ARGS];
    	struct ast_cli_entry *e;
    	int x;
    	char *dup;
    	x = AST_MAX_ARGS;
    	if ((dup = parse_args(s, &x, argv))) {
    		/* We need at least one entry, or ignore */
    		if (x > 0) {
    
    Mark Spencer's avatar
    Mark Spencer committed
    			e = find_cli(argv, 0);
    
    Mark Spencer's avatar
    Mark Spencer committed
    			if (e)
    				e->inuse++;
    
    Mark Spencer's avatar
    Mark Spencer committed
    			if (e) {
    				switch(e->handler(fd, x, argv)) {
    				case RESULT_SHOWUSAGE:
    					ast_cli(fd, e->usage);
    					break;
    				}
    			} else 
    
    Mark Spencer's avatar
    Mark Spencer committed
    				ast_cli(fd, "No such command '%s' (type 'help' for help)\n", find_best(argv));
    
    Mark Spencer's avatar
    Mark Spencer committed
    			if (e) {
    
    Mark Spencer's avatar
    Mark Spencer committed
    				e->inuse--;
    
    Mark Spencer's avatar
    Mark Spencer committed
    		}
    		free(dup);
    	} else {
    		ast_log(LOG_WARNING, "Out of memory\n");	
    		return -1;
    	}
    	return 0;
    }