(sl_loop): Fix general broken-ness.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@4511 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
43
lib/sl/sl.c
43
lib/sl/sl.c
@@ -181,49 +181,34 @@ sl_make_argv(char *line, int *ret_argc, char ***ret_argv)
|
|||||||
int
|
int
|
||||||
sl_loop (SL_cmd *cmds, char *prompt)
|
sl_loop (SL_cmd *cmds, char *prompt)
|
||||||
{
|
{
|
||||||
unsigned max_count;
|
char *buf;
|
||||||
char **ptr;
|
int argc;
|
||||||
int ret;
|
char **argv;
|
||||||
|
int ret = 0;
|
||||||
max_count = 17;
|
|
||||||
ptr = malloc(max_count * sizeof(*ptr));
|
|
||||||
if (ptr == NULL) {
|
|
||||||
printf ("sl_loop: failed to allocate %u bytes of memory\n",
|
|
||||||
(int) max_count * sizeof(*ptr));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
char *buf;
|
|
||||||
int count;
|
|
||||||
SL_cmd *c;
|
|
||||||
|
|
||||||
|
while(ret == 0) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
/* XXX should make sure this doesn't do funny things if stdin
|
||||||
|
is not a tty */
|
||||||
buf = readline(prompt);
|
buf = readline(prompt);
|
||||||
if(buf == NULL)
|
if(buf == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if(*buf)
|
if(*buf)
|
||||||
add_history(buf);
|
add_history(buf);
|
||||||
count = 0;
|
argc = 0;
|
||||||
ret = sl_make_argv(buf, &count, &ptr);
|
ret = sl_make_argv(buf, &argc, &argv);
|
||||||
if(ret) {
|
if(ret) {
|
||||||
fprintf(stderr, "sl_loop: out of memory\n");
|
fprintf(stderr, "sl_loop: out of memory\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (count > 0) {
|
ret = sl_command(cmds, argc, argv);
|
||||||
c = sl_match (cmds, ptr[0], 0);
|
if(ret == -1) {
|
||||||
if (c) {
|
printf ("Unrecognized command: %s\n", argv[0]);
|
||||||
ret = (*c->func)(count, ptr);
|
ret = 0;
|
||||||
if (ret != 0) {
|
|
||||||
free (buf);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
printf ("Unrecognized command: %s\n", ptr[0]);
|
|
||||||
}
|
}
|
||||||
|
free(argv);
|
||||||
free(buf);
|
free(buf);
|
||||||
}
|
}
|
||||||
free (ptr);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user