Removed some code duplication
This commit is contained in:
parent
527199c23d
commit
ea8284be82
1 changed files with 38 additions and 37 deletions
75
main.c
75
main.c
|
|
@ -26,6 +26,33 @@ size_t min_size_t(size_t a, size_t b)
|
||||||
return a > b ? b : a;
|
return a > b ? b : a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*Works simular to memcpy, but checks the sizes to avoid buffer overflows. If dest or src are NULL, returns 0, otherwise returns number of copied BYTES*/
|
||||||
|
size_t copy_to_buf(void* dest, size_t dest_len, const void* src, size_t src_len)
|
||||||
|
{
|
||||||
|
if(!dest || !src)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
size_t len = min_size_t(dest_len, src_len);
|
||||||
|
memcpy(dest, src, len);
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Works simular to strcpy, but checks the sizes to avoid buffer overflows. If dest or src are NULL, returns 0, otherwise returns number of copied BYTES*/
|
||||||
|
size_t copy_str_to_buf(void* dest, size_t dest_len, const char* src)
|
||||||
|
{
|
||||||
|
if(!dest || !src)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
size_t len = copy_to_buf(dest, dest_len, src, strlen(src) + 1);
|
||||||
|
if(len != 0)
|
||||||
|
{
|
||||||
|
((char*)dest)[len] = '\0';
|
||||||
|
}
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
void sigint_handler(int signo)
|
void sigint_handler(int signo)
|
||||||
{
|
{
|
||||||
if(!jump_active)
|
if(!jump_active)
|
||||||
|
|
@ -910,39 +937,33 @@ int execute_pipeline(struct pipeline* pl, int capture, char** out)
|
||||||
char* get_user()
|
char* get_user()
|
||||||
{
|
{
|
||||||
static char buf[max_env_var_length] = {0};
|
static char buf[max_env_var_length] = {0};
|
||||||
char* result = getenv("USER");
|
size_t len = copy_str_to_buf(buf, sizeof(buf), getenv("USER"));
|
||||||
if(!result)
|
if(!len)
|
||||||
{
|
{
|
||||||
return "UNKNOWN";
|
return "UNKNOWN";
|
||||||
}
|
}
|
||||||
size_t length = min_size_t(sizeof(buf), strlen(result) + 1);
|
|
||||||
memcpy(buf, result, length);
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* get_home()
|
char* get_home()
|
||||||
{
|
{
|
||||||
static char buf[max_length] = {0};
|
static char buf[max_length] = {0};
|
||||||
char* result = getenv("HOME");
|
size_t len = copy_str_to_buf(buf, sizeof(buf), getenv("HOME"));
|
||||||
if(!result)
|
if(!len)
|
||||||
{
|
{
|
||||||
return "UNKNOWN_HOME_PATH";
|
return "UNKNOWN_HOME_PATH";
|
||||||
}
|
}
|
||||||
size_t length = min_size_t(sizeof(buf), strlen(result) + 1);
|
|
||||||
memcpy(buf, result, length);
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* get_pwd()
|
char* get_pwd()
|
||||||
{
|
{
|
||||||
static char buf[max_length] = {0};
|
static char buf[max_length] = {0};
|
||||||
char* result = getenv("PWD");
|
size_t len = copy_str_to_buf(buf, sizeof(buf), getenv("PWD"));
|
||||||
if(!result)
|
if(!len)
|
||||||
{
|
{
|
||||||
return "UNKNOWN";
|
return "UNKNOWN";
|
||||||
}
|
}
|
||||||
size_t length = min_size_t(sizeof(buf), strlen(result) + 1);
|
|
||||||
memcpy(buf, result, length);
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -976,21 +997,14 @@ char* generate_ps1_prompt()
|
||||||
{
|
{
|
||||||
static char prompt_buf[max_length] = {0};
|
static char prompt_buf[max_length] = {0};
|
||||||
char env_buf[max_env_var_length] = {0};
|
char env_buf[max_env_var_length] = {0};
|
||||||
char* ps1 = getenv("PS1");
|
size_t ps1_len = copy_str_to_buf(env_buf, sizeof(env_buf), getenv("PS1"));
|
||||||
if(!ps1)
|
|
||||||
{
|
|
||||||
return default_prompt;
|
|
||||||
}
|
|
||||||
size_t ps1_len = min_size_t(sizeof(env_buf), strlen(ps1) + 1) - 1;
|
|
||||||
if(ps1_len == 0)
|
if(ps1_len == 0)
|
||||||
{
|
{
|
||||||
return default_prompt;
|
return default_prompt;
|
||||||
}
|
}
|
||||||
memcpy(env_buf, ps1, ps1_len);
|
|
||||||
env_buf[ps1_len + 1] = '\0';
|
|
||||||
if(ps1_len < 2)
|
if(ps1_len < 2)
|
||||||
{
|
{
|
||||||
memcpy(prompt_buf, env_buf, ps1_len + 1);
|
copy_str_to_buf(prompt_buf, sizeof(prompt_buf), getenv("PS1"));
|
||||||
return prompt_buf;
|
return prompt_buf;
|
||||||
}
|
}
|
||||||
size_t i = 1, j = 0;
|
size_t i = 1, j = 0;
|
||||||
|
|
@ -1027,25 +1041,12 @@ char* generate_ps1_prompt()
|
||||||
i++;
|
i++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
size_t len = strlen(data);
|
size_t start_len = copy_to_buf(prompt_buf + j, sizeof(prompt_buf) - j, env_buf + start, i - start - 1);
|
||||||
if(j + i - 1 - start + len >= sizeof(prompt_buf))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "\nOut of memory(1) for prompt: %d >= %d\n", j + i - start + len, sizeof(prompt_buf));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
size_t start_len = min_size_t(sizeof(prompt_buf) - j, i - start - 1);
|
|
||||||
memcpy(prompt_buf + j, env_buf + start, start_len);
|
|
||||||
j += start_len;
|
j += start_len;
|
||||||
if(j + len >= sizeof(prompt_buf))
|
size_t len = copy_to_buf(prompt_buf + j, sizeof(prompt_buf) - j, data, strlen(data));
|
||||||
{
|
|
||||||
fprintf(stderr, "\nOut of memory(2) for prompt: %d >= %d\n", j + len, sizeof(prompt_buf));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
memcpy(prompt_buf + j, data, len);
|
|
||||||
i += 1; start = i; j += len;
|
i += 1; start = i; j += len;
|
||||||
}
|
}
|
||||||
size_t start_len = min_size_t(sizeof(prompt_buf) - j, i - start);
|
size_t start_len = copy_to_buf(prompt_buf + j, sizeof(prompt_buf) - j, env_buf + start, i - start);
|
||||||
memcpy(prompt_buf + j, env_buf + start, start_len);
|
|
||||||
j += start_len;
|
j += start_len;
|
||||||
prompt_buf[j] = '\0';
|
prompt_buf[j] = '\0';
|
||||||
return prompt_buf;
|
return prompt_buf;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue