aboutsummaryrefslogtreecommitdiffstats
path: root/src/edit.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/edit.c')
-rw-r--r--src/edit.c181
1 files changed, 143 insertions, 38 deletions
diff --git a/src/edit.c b/src/edit.c
index 5179a54..b41f748 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -81,7 +81,6 @@ static int edit_get_config(DB *db, const char *pName, char *ret, const char *cNa
}
}
free(tmp);
- break;
}
else {
/* Since we are here, it means there is only 1 config for the selected program */
@@ -100,78 +99,184 @@ static int edit_get_config(DB *db, const char *pName, char *ret, const char *cNa
return -1;
}
+static EditOpt edit_make_options(cklist *args) {
+ list_rewind(args);
+
+ EditOpt editOpt = {
+ .pName = NULL,
+ .cBasename = NULL,
+ .editor = NULL,
+ .cmd = NULL,
+ .sudo = 0,
+ .err = 0
+ };
+
+ if (list_size(args)) {
+ editOpt.pName = list_get(args);
+ }
+ else {
+ editOpt.err = 1;
+ sERR("Please specify the program to edit.")
+ goto done;
+ }
+
+ if (list_next(args)) {
+ /* if the next argument doesn't start with `-` treat it as
+ a config basename */
+ if (strncmp("-", list_get(args), strlen("-")) != 0) {
+ editOpt.cBasename = list_get(args);
+ if (!list_next(args)) {
+ goto done;
+ }
+ }
+ do {
+ if (strcmp(list_get(args), "-s") == 0) {
+ editOpt.sudo = 1;
+ }
+ else if (strcmp(list_get(args), "--editor") == 0) {
+ if (editOpt.cmd) {
+ sERR("Use only one of --command and --editor");
+ editOpt.err = 1;
+ break;
+ }
+ if (!list_next(args)) {
+ sERR("Specify the editor to use.")
+ editOpt.err = 1;
+ break;
+ }
+ editOpt.editor = list_get(args);
+ }
+ else if (strcmp(list_get(args), "--command") == 0) {
+ if (editOpt.editor) {
+ sERR("Use only one of --command and --editor");
+ editOpt.err = 1;
+ break;
+ }
+ if (!list_next(args)) {
+ sERR("Specify the command to use.")
+ editOpt.err = 1;
+ break;
+ }
+ editOpt.cmd = list_get(args);
+ }
+ else {
+ editOpt.err = 1;
+ ERR("Unknown argument %s", list_get(args));
+ break;
+ }
+ } while(list_next(args));
+ }
+ done:
+ list_rewind(args);
+ return editOpt;
+}
+
+static char * form_edit_command(char *ret, const EditOpt *editOpt, const char *confPath) {
+ char command[STR_L] = "";
+
+ if (editOpt->editor) {
+ char tmp[STR_L] = "which ";
+ strcat(tmp, editOpt->editor);
+ strcat(tmp, " > /dev/null 2>&1");
+ if (system(tmp) != 0) {
+ ERR("Editor %s not found.", editOpt->editor);
+ HELP("If you want to run the command either way use --command instead of --editor.")
+ return NULL;
+ }
+ else {
+ strcpy(command, editOpt->editor);
+ }
+ }
+ else if (editOpt->cmd) {
+ strcpy(command, editOpt->cmd);
+ }
+ else {
+ char *editor = getenv("EDITOR");
+ if (str_is_empty(editor)) {
+ if (system("which emacs > /dev/null 2>&1") != 0) {
+ ERR("No editor avaliable.");
+ HELP("Emacs not found. Please set $EDITOR to your desired editor,");
+ HELP("or use the --editor flag.")
+ return NULL;
+ }
+ strcpy(command, "nano");
+ }
+ else {
+ strcpy(command, editor);
+ }
+ }
+
+ strcat(command, " ");
+ strcat(command, confPath);
+
+ if (editOpt->sudo) {
+ char tmp[STR_L] = "sudo ";
+ strcat(tmp, command);
+ return strcpy(ret, tmp);
+ }
+
+ return strcpy(ret, command);
+}
+
int run_EDIT(UserOpt *opt, Conf *conf) {
+ char confPath[STR_L] = "";
+ char confName[STR_M] = "";
+ int secret = 0;
DB db;
if (open_DB(&db, opt)) {
return -1;
}
- list_rewind(opt->args);
- char confPath[STR_L] = "";
- char confName[STR_M] = "";
- int secret = 0;
- /* Since we are here, args have to be 1 or 2 */
- char *pName = list_get(opt->args);
- if (!program_exists(&db, pName)) {
- ERR("Program %s doesn't exist in the database.", pName);
+ EditOpt editOpt = edit_make_options(opt->args);
+ if (editOpt.err) {
+ goto error;
+ }
+
+ if (!program_exists(&db, editOpt.pName)) {
+ ERR("Program %s doesn't exist in the database.", editOpt.pName);
goto error;
}
- /* If there is no next argument */
- if (!list_next(opt->args)) {
+ /* If there is no config basename */
+ if (!editOpt.cBasename) {
/* If there is no primary config*/
- if (edit_get_prime_config_from_program(&db, pName, confName, &secret) == -1) {
+ if (edit_get_prime_config_from_program(&db, editOpt.pName, confName, &secret) == -1) {
/* If the program has only one config */
- if (get_config_number(&db, pName) == 1) {
- if (edit_get_config(&db, pName, confName, NULL, &secret)) {
- ERR("Coudln't find config file for %s", pName);
+ if (get_config_number(&db, editOpt.pName) == 1) {
+ if (edit_get_config(&db, editOpt.pName, confName, NULL, &secret)) {
+ ERR("Coudln't find config file for %s", editOpt.pName);
goto error;
}
}
/* If the program has many configs */
else {
HELP("Ambiguous config. Please type the config name after the program.");
- print_suggested_configs(&db, pName);
+ print_suggested_configs(&db, editOpt.pName);
goto error;
}
}
}
/* If there are more arguments */
else {
- char *cName = list_get(opt->args);
- if (edit_get_config(&db, pName, confName, cName, &secret)) {
- ERR("Program %s doesn't have a config named %s", pName, cName);
- print_suggested_configs(&db, pName);
+ if (edit_get_config(&db, editOpt.pName, confName, editOpt.cBasename, &secret)) {
+ ERR("Program %s doesn't have a config named %s", editOpt.pName, editOpt.cBasename);
+ print_suggested_configs(&db, editOpt.pName);
goto error;
}
}
close_DB(&db);
str_join_dirname_with_basename(confPath, secret ? conf->scrt_dir : conf->vc_dir, confName);
- char *editor = getenv("EDITOR");
char command[STR_L] = "";
- if (str_is_empty(editor)) {
- if (system("which nano > /dev/null 2>&1") != 0) {
- ERR("Nano not found. Please set $EDITOR to your desired editor.");
- return -1;
- }
- strcpy(command, "nano");
- } else {
- strcpy(command, editor);
+ if (form_edit_command(command, &editOpt, confPath)) {
+ hLOG("Running: %s", command);
+ return system(command);
}
-
-
- strcat(command, " ");
- strcat(command, confPath);
-
- HELP("editing...\n%s", command);
- system(command);
- return 0;
error:
close_DB(&db);
return -1;
}
void print_EDIT_help() {
- HELP("ck edit PROGRAM_NAME [CONFIG_BASENAME]");
+ HELP("ck edit PROGRAM_NAME [CONFIG_BASENAME] [--editor EDITOR] [--command COMMAND] [-s]");
}