string escaping

This commit is contained in:
nova
2026-05-01 22:17:33 +02:00
parent 6372dbba69
commit 1711926003
6 changed files with 85 additions and 61 deletions

View File

@@ -80,27 +80,54 @@ char* smartstrcasestr(const char *haystack, const char *needle){
return ret; return ret;
} }
char* parse_cmd_char(const char *cmd, const char *path){
char *index = strstr(cmd, SETTINGS_COMMAND_REPLACE_STR); char* parse_cmd(const char *cmd, file *f){
const char *offset = strstr(cmd, SETTINGS_COMMAND_REPLACE_STR);
int count = 0;
char *out; char *out;
char *pos;
unsigned long i = 0;
while(f->file_name[i]) {
if (f->file_name[i] == '\'') {
count++;
}
i++;
}
if (index) { out = malloc(strlen(cmd) + 1 + (strlen(f->file_name)+(count*3)) + 1);
out = malloc(strlen(cmd) + 1 + strlen(path) + 1);
char *o = out; pos = out;
memcpy(out, cmd, index - cmd); if (offset) {
o += index-cmd; memcpy(pos, cmd, offset - cmd);
*o = '\"'; pos += offset - cmd + 1;
o++;
memcpy(o, path, strlen(path));
o += strlen(path);
*o = '\"';
memcpy(o+1, index + 1, strlen(index+1));
*(o+strlen(index+1)+1) = '\0';
return out;
} else { } else {
concat(out, cmd, " ./\"", 0); memcpy(pos, cmd, strlen(cmd));
concat(out, out, path, 1); pos += strlen(cmd) + 1;
concat(out, out, "\"", 1); }
pos[-1] = ' ';
pos[0] = '\'';
pos++;
i = 0;
while(f->file_name[i]) {
if (f->file_name[i] == '\'') {
*pos++ = '\'';
*pos++ = '\\';
*pos++ = '\'';
}
*pos = f->file_name[i];
pos++;
i++;
}
*pos = '\'';
if (offset) {
pos[1]= ' ';
memcpy(pos + 1, offset+1, strlen(offset+1));
pos[strlen(offset+1)] = '\0';
} else {
pos[1] = '\0';
} }
return out; return out;

View File

@@ -7,5 +7,5 @@
/*char* concat(const char *s1, const char *s2);*/ /*char* concat(const char *s1, const char *s2);*/
char* smartstrcasestr(const char *haystack, const char *needle); char* smartstrcasestr(const char *haystack, const char *needle);
char* parse_cmd_char(const char *cmd, const char *path); char* parse_cmd(const char *cmd, file *f);

View File

@@ -13,26 +13,19 @@ extern unsigned int terminal_height;
extern unsigned int terminal_width; extern unsigned int terminal_width;
char previewd; char previewd;
char* text(char *path, unsigned long *file_size); char* text(file *f);
void images_print(char *file_name); void images_print(char *file_name);
void images_clear(); void images_clear();
char* generic(char *path); char* generic(file *f);
char* get_mimetype(char *path){ char* get_mimetype(file *f){
static char *cmd_str = "file --mime-type -b ./\""; static const char *cmd_str = "file --mime-type -b";
unsigned long cmd_len = strlen(cmd_str); char *cmd = parse_cmd(cmd_str, f);
unsigned int path_len = strlen(path);
char *cmd = malloc((cmd_len + path_len) + 2);
memset(cmd, ' ', cmd_len + path_len);
memcpy(cmd, cmd_str, cmd_len);
memcpy(cmd + cmd_len, path, path_len);
cmd[cmd_len + path_len] = '\"';
cmd[cmd_len + path_len + 1] = '\0';
FILE *cmd_open = popen(cmd, "r"); FILE *cmd_open = popen(cmd, "r");
char *line = NULL; char *line = NULL;
size_t size = 0; size_t size = 0;
free(cmd); free(cmd);
if (getline(&line, &size, cmd_open) != -1){ if (getline(&line, &size, cmd_open) != -1){
pclose(cmd_open); pclose(cmd_open);
@@ -42,57 +35,60 @@ char* get_mimetype(char *path){
return "unknown"; return "unknown";
} }
} }
char* preview_file(char *file_name, unsigned long file_size){ char* preview_file(file *f){
/* this calls "file" on path */ /* this calls "file" on path */
char *file_buffer; char *file_buffer;
char *mime = get_mimetype(file_name); char *mime = get_mimetype(f);
#if SETTINGS_UEBERZUG_IMAGE_PREVIEW != 0 #if SETTINGS_UEBERZUG_IMAGE_PREVIEW != 0
images_clear(); images_clear();
#endif #endif
if (strstr(mime, "text")) { if (strstr(mime, "text")) {
file_buffer = text(file_name, &file_size); file_buffer = text(f);
#if SETTINGS_UEBERZUG_IMAGE_PREVIEW != 0 #if SETTINGS_UEBERZUG_IMAGE_PREVIEW != 0
} else if (strstr(mime, "image")) { } else if (strstr(mime, "image")) {
file_buffer = generic(file_name); file_buffer = generic(f);
images_print(file_name); images_print(f->file_name);
previewd = 1; previewd = 1;
#endif #endif
} else { } else {
file_buffer = generic(file_name); file_buffer = generic(f);
} }
free(mime); free(mime);
return file_buffer; return file_buffer;
} }
char* text(char *path, unsigned long *file_size){ char* text(file *f){
unsigned long size = (terminal_width/2) * terminal_height; unsigned long size = (terminal_width/2) * terminal_height;
if (size > *file_size) { if (size > f->file_size) {
size = *file_size; size = f->file_size;
} }
char *file_buffer = malloc(size + 1); char *file_buffer = malloc(size + 1);
FILE *fp = fopen(path, "r"); FILE *fp = fopen(f->file_name, "r");
if (fread(file_buffer, size, 1, fp) != 0) { if (fread(file_buffer, size, 1, fp) != 0) {
fclose(fp);
file_buffer[size] = '\0'; file_buffer[size] = '\0';
return file_buffer; return file_buffer;
} else { } else {
fclose(fp);
return "failed reading file"; return "failed reading file";
} }
} }
char* generic(char *path){ char* generic(file *f){
char *cmd; static const char *cmd_str = "file ";
concat(cmd, "file ./\"", path, 0); char *cmd = parse_cmd(cmd_str, f);
concat(cmd, cmd, "\"", 1);
FILE *cmd_open = popen(cmd, "r"); FILE *cmd_open = popen(cmd, "r");
char *line = NULL; char *line = NULL;
size_t size = 0; size_t size = 0;
free(cmd);
if (getline(&line, &size, cmd_open) != -1) { if (getline(&line, &size, cmd_open) != -1) {
pclose(cmd_open); pclose(cmd_open);
return line; return line;

View File

@@ -4,8 +4,8 @@
#include "config.h" #include "config.h"
#endif #endif
char* preview_file(char *file_name, unsigned long file_size); char* preview_file(file *f);
char* get_mimetype(char *path); char* get_mimetype(file *f);
void images_clear(); void images_clear();
void ueberzug_init(); void ueberzug_init();
#if SETTINGS_UEBERZUG_IMAGE_PREVIEW != 0 #if SETTINGS_UEBERZUG_IMAGE_PREVIEW != 0

View File

@@ -234,20 +234,19 @@ void move_right(){
} else { } else {
unsigned long i = 0; unsigned long i = 0;
char match = 0; char match = 0;
char *mime = get_mimetype(mid_content[selected_file_current].file_name); char *mime = get_mimetype(&mid_content[selected_file_current]);
char *extension = strrchr(mid_content[selected_file_current].file_name, '.'); char *extension = strrchr(mid_content[selected_file_current].file_name, '.');
if (extension != NULL) { if (extension != NULL) {
for (i = 0; i < file_extension_default_count; i++) { for (i = 0; i < file_extension_default_count; i++) {
if (strstr(extension, file_extension_default_cmd[i].file_extension)) { if (strstr(extension, file_extension_default_cmd[i].file_extension)) {
char *cmd; char *cmd;
concat(cmd, file_extension_default_cmd[i].command, " ./\'", 0); cmd = parse_cmd(file_extension_default_cmd[i].command, &mid_content[selected_file_current]);
concat(cmd, cmd, mid_content[selected_file_current].file_name, 1); printf("\n%s\n",cmd);
concat(cmd, cmd, "\'", 1);
if (system(cmd) == -1) { if (system(cmd) == -1) {
/*do nothing*/ /*do nothing*/
} }
free(cmd);
curs_set(1); /*for some reason, 1 here turns it invisible once again */ curs_set(1); /*for some reason, 1 here turns it invisible once again */
match = 1; match = 1;
status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_RELOAD_FULL | STATUS_RELOAD_DIRECTORY); status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_RELOAD_FULL | STATUS_RELOAD_DIRECTORY);
@@ -259,7 +258,7 @@ void move_right(){
for (i = 0; i < mimetype_default_count; i++) { for (i = 0; i < mimetype_default_count; i++) {
if (strstr(mime, mimetype_default_cmd[i].mimetype)) { if (strstr(mime, mimetype_default_cmd[i].mimetype)) {
char *cmd = parse_cmd_char(mimetype_default_cmd[i].command, mid_content[selected_file_current].file_name); char *cmd = parse_cmd(mimetype_default_cmd[i].command, &mid_content[selected_file_current]);
if (system(cmd) == -1) { if (system(cmd) == -1) {
/*do nothing*/ /*do nothing*/
} }

View File

@@ -87,8 +87,7 @@ void *thread_mid(){
mid_content->file_size = 0; mid_content->file_size = 0;
mid_content->permissions = 0; mid_content->permissions = 0;
mid_content->color_pair = 0; mid_content->color_pair = 0;
mid_content->file_name = malloc(sizeof(char)); mid_content->file_name = "";
mid_content->file_name[0] = '\0';
mid_file_count = 0; mid_file_count = 0;
@@ -149,14 +148,17 @@ void *thread_lft(){
void *thread_rgt(){ void *thread_rgt(){
file file_current; file file_current;
file_current.file_name = NULL;
while(!(status & STATUS_QUIT_PROGRAM)){ while(!(status & STATUS_QUIT_PROGRAM)){
pthread_mutex_lock(&mutex_rgt); pthread_mutex_lock(&mutex_rgt);
pthread_cond_wait(&cond_rgt, &mutex_rgt); pthread_cond_wait(&cond_rgt, &mutex_rgt);
pthread_mutex_lock(&mutex_mid); pthread_mutex_lock(&mutex_mid);
char *path = mid_content[selected_file_current].file_name; free(file_current.file_name);
memcpy(&file_current, &mid_content[selected_file_current], sizeof(file)); memcpy(&file_current, &mid_content[selected_file_current], sizeof(file));
file_current.file_name = malloc(strlen(mid_content[selected_file_current].file_name));
memcpy(file_current.file_name, mid_content[selected_file_current].file_name, strlen(mid_content[selected_file_current].file_name)+1);
pthread_mutex_unlock(&mutex_mid); pthread_mutex_unlock(&mutex_mid);
if (file_current.permissions & S_IRUSR) { if (file_current.permissions & S_IRUSR) {
@@ -173,11 +175,11 @@ void *thread_rgt(){
} }
free(rgt_content); free(rgt_content);
rgt_file_count = get_dir_size(path); rgt_file_count = get_dir_size(file_current.file_name);
if (rgt_file_count) { /* fails if dir empty */ if (rgt_file_count) { /* fails if dir empty */
rgt_content = malloc(rgt_file_count * sizeof(file)); rgt_content = malloc(rgt_file_count * sizeof(file));
memset(rgt_content, '\0', rgt_file_count * sizeof(file)); memset(rgt_content, '\0', rgt_file_count * sizeof(file));
get_dir_content(path, &rgt_file_count, rgt_content); get_dir_content(file_current.file_name, &rgt_file_count, rgt_content);
rgt_content[0].status &= ~FILE_STATUS_FILE_OPEN; rgt_content[0].status &= ~FILE_STATUS_FILE_OPEN;
free(rgt_buffer); free(rgt_buffer);
@@ -203,7 +205,7 @@ void *thread_rgt(){
free(rgt_buffer); free(rgt_buffer);
rgt_content->file_type = FILE_TYPE_OPEN_FILE; rgt_content->file_type = FILE_TYPE_OPEN_FILE;
rgt_content->status = FILE_STATUS_HOVER; rgt_content->status = FILE_STATUS_HOVER;
rgt_buffer = preview_file(path, file_current.file_size); rgt_buffer = preview_file(&file_current);
} }
} else { } else {
unsigned long i = 0; unsigned long i = 0;