int ckl_script_init(ckl_script_t *s, ckl_conf_t *conf) { int rv; rv = ckl_tmp_file(&s->path, &s->fd); if (rv < 0) { ckl_error_out("failed to create script temp file"); return rv; } const char *sh = getenv("SHELL"); if (!sh) { sh = "/bin/sh"; } s->shell = strdup(sh); return 0; }
static int do_send_msg(ckl_conf_t *conf, const char *usermsg) { int rv; const char *editor; ckl_msg_t *msg = calloc(1, sizeof(ckl_msg_t)); ckl_transport_t *transport = calloc(1, sizeof(ckl_transport_t)); ckl_script_t *script = calloc(1, sizeof(ckl_script_t)); rv = ckl_msg_init(msg); if (rv < 0) { ckl_error_out("msg_init failed."); return rv; } if (usermsg == NULL) { rv = ckl_editor_find(&editor); if (rv < 0) { fprintf(stderr, "Warning: no EDITOR found, using `vi`\n"); editor = "vi"; } char *path; FILE *fd; rv = ckl_tmp_file(&path, &fd); if (rv < 0) { ckl_error_out("Failed to setup tempfile for editting."); return rv; } rv = ckl_editor_fill_file(conf, msg, fd); if (rv < 0) { ckl_error_out("Failed to prefile file"); return rv; } rv = ckl_editor_edit(editor, path); if (rv < 0) { ckl_error_out("editor broke?"); return rv; } rv = ckl_editor_read_file(msg, path); if (rv < 0) { ckl_error_out("Failed to read editted file"); return rv; } fclose(fd); unlink(path); } else { msg->msg = strdup(usermsg); } if (msg->msg == NULL) { ckl_error_out("no message specified"); } if (conf->script_mode) { rv = ckl_script_init(script, conf); if (rv < 0) { ckl_error_out("script_init failed."); return rv; } rv = ckl_script_record(script, msg); if (rv < 0) { ckl_error_out("script_record failed."); return rv; } } rv = ckl_transport_init(transport, conf); if (rv < 0) { ckl_error_out("transport_init failed."); return rv; } rv = ckl_transport_msg_send(transport, conf, msg); if (rv < 0) { ckl_error_out("msg_send failed."); return rv; } ckl_transport_free(transport); ckl_msg_free(msg); ckl_script_free(script); return 0; }