Changeset b781cc49 in mainline
- Timestamp:
- 2019-07-05T18:37:31Z (5 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- fa603e99
- Parents:
- 53afa639 (diff), 46288ee (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2019-07-05 18:37:31)
- git-committer:
- GitHub <noreply@…> (2019-07-05 18:37:31)
- Location:
- uspace/app/bdsh
- Files:
-
- 8 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bdsh/Makefile
r53afa639 rb781cc49 36 36 cmds/modules/module_aliases.c \ 37 37 cmds/modules/modules.c \ 38 cmds/modules/alias/alias.c \ 39 cmds/modules/unalias/unalias.c \ 38 40 cmds/modules/help/help.c \ 39 41 cmds/modules/mkdir/mkdir.c \ -
uspace/app/bdsh/cmds/modules/modules.c
r53afa639 rb781cc49 63 63 #include "echo/entry.h" 64 64 #include "cmp/entry.h" 65 #include "alias/entry.h" 66 #include "unalias/entry.h" 65 67 66 68 /* … … 88 90 #include "echo/echo_def.inc" 89 91 #include "cmp/cmp_def.inc" 92 #include "alias/alias_def.inc" 93 #include "unalias/unalias_def.inc" 90 94 91 95 { NULL, NULL, NULL, NULL } -
uspace/app/bdsh/cmds/modules/modules.h
r53afa639 rb781cc49 31 31 32 32 #include "../cmds.h" 33 #include "modules.h"34 33 35 34 extern module_t modules[]; -
uspace/app/bdsh/compl.c
r53afa639 rb781cc49 35 35 #include <vfs/vfs.h> 36 36 #include <str.h> 37 37 #include <adt/odict.h> 38 39 #include "scli.h" 38 40 #include "cmds/cmds.h" 39 41 #include "compl.h" … … 63 65 /** Length of string prefix (number of characters) */ 64 66 size_t prefix_len; 67 68 /* Pointer to the current alias */ 69 odlink_t *alias_link; 65 70 66 71 /** Pointer inside list of modules */ … … 243 248 } else if (cs->is_command) { 244 249 /* Command without path */ 250 cs->alias_link = odict_first(&alias_dict); 245 251 cs->module = modules; 246 252 cs->builtin = builtins; … … 321 327 } 322 328 329 /* Alias */ 330 if (cs->alias_link != NULL) { 331 while (*compl == NULL && cs->alias_link != NULL) { 332 alias_t *data = odict_get_instance(cs->alias_link, alias_t, odict); 333 if (compl_match_prefix(cs, data->name)) { 334 asprintf(compl, "%s ", data->name); 335 cs->last_compl = *compl; 336 if (*compl == NULL) 337 return ENOMEM; 338 } 339 cs->alias_link = odict_next(cs->alias_link, &alias_dict); 340 } 341 } 342 323 343 /* Modules */ 324 344 if (cs->module != NULL) { 325 345 while (*compl == NULL && cs->module->name != NULL) { 346 /* prevents multiple listing of an overriden cmd */ 326 347 if (compl_match_prefix(cs, cs->module->name)) { 327 asprintf(compl, "%s ", cs->module->name); 328 cs->last_compl = *compl; 329 if (*compl == NULL) 330 return ENOMEM; 348 odlink_t *alias_link = odict_find_eq(&alias_dict, (void *)cs->module->name, NULL); 349 if (alias_link == NULL) { 350 asprintf(compl, "%s ", cs->module->name); 351 cs->last_compl = *compl; 352 if (*compl == NULL) 353 return ENOMEM; 354 } 331 355 } 332 356 cs->module++; … … 338 362 while (*compl == NULL && cs->builtin->name != NULL) { 339 363 if (compl_match_prefix(cs, cs->builtin->name)) { 340 asprintf(compl, "%s ", cs->builtin->name); 341 cs->last_compl = *compl; 342 if (*compl == NULL) 343 return ENOMEM; 364 /* prevents multiple listing of an overriden cmd */ 365 odlink_t *alias_link = odict_find_eq(&alias_dict, (void *)cs->module->name, NULL); 366 if (alias_link == NULL) { 367 asprintf(compl, "%s ", cs->builtin->name); 368 cs->last_compl = *compl; 369 if (*compl == NULL) 370 return ENOMEM; 371 } 344 372 } 345 373 cs->builtin++; … … 389 417 free(ent_path); 390 418 419 /* prevents multiple listing of an overriden cmd */ 420 if (cs->is_command && !ent_stat.is_directory) { 421 odlink_t *alias_link = odict_find_eq(&alias_dict, (void *)dent->d_name, NULL); 422 if (alias_link != NULL) { 423 continue; 424 } 425 } 426 391 427 asprintf(compl, "%s%c", dent->d_name, 392 428 ent_stat.is_directory ? '/' : ' '); -
uspace/app/bdsh/config.h
r53afa639 rb781cc49 42 42 #endif 43 43 44 /* define maximal nested aliases */ 45 #ifndef HUBS_MAX 46 #define HUBS_MAX 20 47 #endif 48 44 49 /* Used in many places */ 45 50 #define SMALL_BUFLEN 256 -
uspace/app/bdsh/input.c
r53afa639 rb781cc49 3 3 * Copyright (c) 2011 Jiri Svoboda 4 4 * Copyright (c) 2011 Martin Sucha 5 * Copyright (c) 2018 Matthieu Riolo 5 6 * All rights reserved. 6 7 * … … 43 44 #include <stdbool.h> 44 45 #include <tinput.h> 46 #include <adt/odict.h> 47 #include <adt/list.h> 45 48 46 49 #include "config.h" … … 62 65 static void print_pipe_usage(void); 63 66 67 typedef struct { 68 link_t alias_hup_link; 69 alias_t *alias; 70 } alias_hup_t; 71 72 static bool find_alias_hup(alias_t *alias, list_t *alias_hups) 73 { 74 list_foreach(*alias_hups, alias_hup_link, alias_hup_t, link) { 75 if (alias == link->alias) { 76 return true; 77 } 78 } 79 80 return false; 81 } 82 64 83 /* 65 84 * Tokenizes input from console, sees if the first word is a built-in, if so … … 67 86 * the handler 68 87 */ 69 errno_t process_input(cliuser_t *usr) 70 { 88 static errno_t process_input_nohup(cliuser_t *usr, list_t *alias_hups, size_t count_executed_hups) 89 { 90 if (count_executed_hups >= HUBS_MAX) { 91 cli_error(CL_EFAIL, "%s: maximal alias hubs reached\n", PACKAGE_NAME); 92 return ELIMIT; 93 } 94 71 95 token_t *tokens_buf = calloc(WORD_MAX, sizeof(token_t)); 72 96 if (tokens_buf == NULL) … … 171 195 } 172 196 197 /* test if the passed cmd is an alias */ 198 odlink_t *alias_link = odict_find_eq(&alias_dict, (void *)cmd[0], NULL); 199 if (alias_link != NULL) { 200 alias_t *data = odict_get_instance(alias_link, alias_t, odict); 201 /* check if the alias already has been resolved once */ 202 if (!find_alias_hup(data, alias_hups)) { 203 alias_hup_t *hup = (alias_hup_t *)calloc(1, sizeof(alias_hup_t)); 204 if (hup == NULL) { 205 cli_error(CL_EFAIL, "%s: cannot allocate alias structure\n", PACKAGE_NAME); 206 rc = ENOMEM; 207 goto finit; 208 } 209 210 hup->alias = data; 211 list_append(&hup->alias_hup_link, alias_hups); 212 213 char *oldLine = usr->line; 214 const size_t input_length = str_size(usr->line) - str_size(cmd[0]) + str_size(data->value) + 1; 215 usr->line = (char *)malloc(input_length); 216 if (usr->line == NULL) { 217 cli_error(CL_EFAIL, "%s: cannot allocate input structure\n", PACKAGE_NAME); 218 rc = ENOMEM; 219 goto finit; 220 } 221 222 usr->line[0] = '\0'; 223 224 unsigned int cmd_replace_index = cmd_token_start; 225 for (i = 0; i < tokens_length; i++) { 226 if (i == cmd_replace_index) { 227 /* if there is a pipe symbol than cmd_token_start will point at the SPACE after the pipe symbol */ 228 if (tokens[i].type == TOKTYPE_SPACE) { 229 cmd_replace_index++; 230 str_append(usr->line, input_length, tokens[i].text); 231 continue; 232 } 233 234 str_append(usr->line, input_length, data->value); 235 } else { 236 str_append(usr->line, input_length, tokens[i].text); 237 } 238 } 239 240 /* reprocess input after string replace */ 241 rc = process_input_nohup(usr, alias_hups, count_executed_hups + 1); 242 usr->line = oldLine; 243 goto finit; 244 } 245 } 246 173 247 iostate_t new_iostate = { 174 248 .stdin = stdin, … … 225 299 } 226 300 301 errno_t process_input(cliuser_t *usr) 302 { 303 list_t alias_hups; 304 list_initialize(&alias_hups); 305 306 errno_t rc = process_input_nohup(usr, &alias_hups, 0); 307 308 list_foreach_safe(alias_hups, cur_link, next_link) { 309 alias_hup_t *cur_item = list_get_instance(cur_link, alias_hup_t, alias_hup_link); 310 free(cur_item); 311 } 312 313 return rc; 314 } 315 227 316 void print_pipe_usage(void) 228 317 { -
uspace/app/bdsh/scli.c
r53afa639 rb781cc49 1 1 /* 2 2 * Copyright (c) 2008 Tim Post 3 * Copyright (c) 2018 Matthieu Riolo 3 4 * All rights reserved. 4 5 * … … 31 32 #include <stddef.h> 32 33 #include <str.h> 34 #include <adt/odict.h> 33 35 #include "config.h" 34 36 #include "scli.h" … … 42 44 static iostate_t *iostate; 43 45 static iostate_t stdiostate; 46 47 odict_t alias_dict; 44 48 45 49 /* … … 55 59 */ 56 60 const char *progname = PACKAGE_NAME; 61 62 static int alias_cmp(void *a, void *b) 63 { 64 return str_cmp((char *)a, (char *)b); 65 } 66 67 static void *alias_key(odlink_t *odlink) 68 { 69 return (void *)odict_get_instance(odlink, alias_t, odict)->name; 70 } 57 71 58 72 /* These are not exposed, even to builtins */ … … 108 122 iostate = &stdiostate; 109 123 124 odict_initialize(&alias_dict, alias_key, alias_cmp); 125 110 126 if (cli_init(&usr)) 111 127 exit(EXIT_FAILURE); -
uspace/app/bdsh/scli.h
r53afa639 rb781cc49 1 1 /* 2 2 * Copyright (c) 2008 Tim Post 3 * Copyright (c) 2018 Matthieu Riolo 3 4 * All rights reserved. 4 5 * … … 34 35 #include <stdint.h> 35 36 #include <stdio.h> 37 #include <types/adt/odict.h> 36 38 37 39 typedef struct { … … 54 56 extern void set_iostate(iostate_t *); 55 57 58 extern odict_t alias_dict; 59 60 typedef struct { 61 odlink_t odict; 62 char *name; 63 char *value; 64 } alias_t; 65 56 66 #endif
Note:
See TracChangeset
for help on using the changeset viewer.