X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=cgiedit.c;h=0f0e46d31de3ab965ad02bfd7499f12e88e146ce;hp=348feb0b96c20568f4b56e5d26678957cda40879;hb=e8b4f286757813a2a30dcc277b283b485a22ff44;hpb=1d8a4d7d0e8dc64c681722defd5fe914484caa56 diff --git a/cgiedit.c b/cgiedit.c index 348feb0b..0f0e46d3 100644 --- a/cgiedit.c +++ b/cgiedit.c @@ -1,4 +1,4 @@ -const char cgiedit_rcs[] = "$Id: cgiedit.c,v 1.38 2002/05/03 23:00:38 jongfoster Exp $"; +const char cgiedit_rcs[] = "$Id: cgiedit.c,v 1.40 2002/05/19 11:34:35 jongfoster Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/cgiedit.c,v $ @@ -42,6 +42,18 @@ const char cgiedit_rcs[] = "$Id: cgiedit.c,v 1.38 2002/05/03 23:00:38 jongfoster * * Revisions : * $Log: cgiedit.c,v $ + * Revision 1.40 2002/05/19 11:34:35 jongfoster + * Handling read-only actions files better - report the actual + * error, not "Out of memory"! + * + * Bug report: + * http://sourceforge.net/tracker/index.php?func=detail + * &aid=557905&group_id=11118&atid=111118 + * + * Revision 1.39 2002/05/12 21:39:15 jongfoster + * - Adding Doxygen-style comments to structures and #defines. + * - Correcting function comments + * * Revision 1.38 2002/05/03 23:00:38 jongfoster * Support for templates for "standard actions" buttons. * See bug #549871 @@ -426,6 +438,9 @@ jb_err cgi_error_parse(struct client_state *csp, jb_err cgi_error_file(struct client_state *csp, struct http_response *rsp, const char *filename); +jb_err cgi_error_file_read_only(struct client_state *csp, + struct http_response *rsp, + const char *filename); jb_err cgi_error_disabled(struct client_state *csp, struct http_response *rsp); @@ -471,6 +486,34 @@ static jb_err map_copy_parameter_url(struct map *out, const char *name); #endif /* unused function */ +/* Internal convenience functions */ +static char *section_target(const unsigned sectionid); + +/********************************************************************* + * + * Function : section_target + * + * Description : Given an unsigned (section id) n, produce a dynamically + * allocated string of the form #l, for use in link + * targets. + * + * Parameters : + * 1 : sectionid = start line number of section + * + * Returns : String with link target, or NULL if out of + * memory + * + *********************************************************************/ +static char *section_target(const unsigned sectionid) +{ + char buf[30]; + + snprintf(buf, 30, "#l%d", sectionid); + return(strdup(buf)); + +} + + /********************************************************************* * * Function : map_copy_parameter_html @@ -600,6 +643,7 @@ jb_err cgi_edit_actions_url_form(struct client_state *csp, struct editable_file * file; struct file_line * cur_line; unsigned line_number; + unsigned section_start_line_number = 0; jb_err err; assert(csp); @@ -628,6 +672,10 @@ jb_err cgi_edit_actions_url_form(struct client_state *csp, for (line_number = 1; (cur_line != NULL) && (line_number < patternid); line_number++) { + if (cur_line->type == FILE_LINE_ACTION) + { + section_start_line_number = line_number; + } cur_line = cur_line->next; } @@ -651,6 +699,7 @@ jb_err cgi_edit_actions_url_form(struct client_state *csp, if (!err) err = map(exports, "v", 1, file->version_str, 1); if (!err) err = map(exports, "p", 1, url_encode(lookup(parameters, "p")), 0); if (!err) err = map(exports, "u", 1, html_encode(cur_line->unprocessed), 0); + if (!err) err = map(exports, "jumptarget", 1, section_target(section_start_line_number), 0); edit_free_file(file); @@ -754,6 +803,7 @@ jb_err cgi_edit_actions_remove_url_form(struct client_state *csp, struct editable_file * file; struct file_line * cur_line; unsigned line_number; + unsigned section_start_line_number = 0; jb_err err; assert(csp); @@ -782,6 +832,10 @@ jb_err cgi_edit_actions_remove_url_form(struct client_state *csp, for (line_number = 1; (cur_line != NULL) && (line_number < patternid); line_number++) { + if (cur_line->type == FILE_LINE_ACTION) + { + section_start_line_number = line_number; + } cur_line = cur_line->next; } @@ -803,8 +857,9 @@ jb_err cgi_edit_actions_remove_url_form(struct client_state *csp, err = map(exports, "f", 1, file->identifier, 1); if (!err) err = map(exports, "v", 1, file->version_str, 1); - if (!err) err = map(exports, "s", 1, url_encode(lookup(parameters, "s")), 0); + if (!err) err = map(exports, "p", 1, url_encode(lookup(parameters, "p")), 0); if (!err) err = map(exports, "u", 1, html_encode(cur_line->unprocessed), 0); + if (!err) err = map(exports, "jumptarget", 1, section_target(section_start_line_number), 0); edit_free_file(file); @@ -2278,6 +2333,51 @@ jb_err cgi_error_file(struct client_state *csp, } +/********************************************************************* + * + * Function : cgi_error_file + * + * Description : CGI function that is called when a file cannot be + * opened for writing by the CGI editor. + * + * Parameters : + * 1 : csp = Current client state (buffers, headers, etc...) + * 2 : rsp = http_response data structure for output + * 3 : filename = The file that we can't write to + * + * CGI Parameters : none + * + * Returns : JB_ERR_OK on success + * JB_ERR_MEMORY on out-of-memory error. + * + *********************************************************************/ +jb_err cgi_error_file_read_only(struct client_state *csp, + struct http_response *rsp, + const char *filename) +{ + struct map *exports; + jb_err err; + + assert(csp); + assert(rsp); + assert(filename); + + if (NULL == (exports = default_exports(csp, NULL))) + { + return JB_ERR_MEMORY; + } + + err = map(exports, "f", 1, html_encode(filename), 0); + if (err) + { + free_map(exports); + return err; + } + + return template_fill_for_cgi(csp, "cgi-error-file-read-only", exports, rsp); +} + + /********************************************************************* * * Function : cgi_error_disabled @@ -3259,12 +3359,19 @@ jb_err cgi_edit_actions_submit(struct client_state *csp, if (err) { /* Error writing file */ + if (err == JB_ERR_FILE) + { + /* Read-only file. */ + err = cgi_error_file_read_only(csp, rsp, file->identifier); + } edit_free_file(file); return err; } target = strdup(CGI_PREFIX "edit-actions-list?f="); string_append(&target, file->identifier); + string_join(&target, section_target(sectionid)); + edit_free_file(file); @@ -3321,6 +3428,7 @@ jb_err cgi_edit_actions_url(struct client_state *csp, struct editable_file * file; struct file_line * cur_line; unsigned line_number; + unsigned section_start_line_number = 0; char * target; jb_err err; @@ -3358,6 +3466,10 @@ jb_err cgi_edit_actions_url(struct client_state *csp, while ((cur_line != NULL) && (line_number < patternid)) { + if (cur_line->type == FILE_LINE_ACTION) + { + section_start_line_number = line_number; + } cur_line = cur_line->next; line_number++; } @@ -3381,12 +3493,18 @@ jb_err cgi_edit_actions_url(struct client_state *csp, if (err) { /* Error writing file */ + if (err == JB_ERR_FILE) + { + /* Read-only file. */ + err = cgi_error_file_read_only(csp, rsp, file->identifier); + } edit_free_file(file); return err; } target = strdup(CGI_PREFIX "edit-actions-list?f="); string_append(&target, file->identifier); + string_join(&target, section_target(section_start_line_number)); edit_free_file(file); @@ -3520,12 +3638,18 @@ jb_err cgi_edit_actions_add_url(struct client_state *csp, if (err) { /* Error writing file */ + if (err == JB_ERR_FILE) + { + /* Read-only file. */ + err = cgi_error_file_read_only(csp, rsp, file->identifier); + } edit_free_file(file); return err; } target = strdup(CGI_PREFIX "edit-actions-list?f="); string_append(&target, file->identifier); + string_join(&target, section_target(sectionid)); edit_free_file(file); @@ -3580,6 +3704,7 @@ jb_err cgi_edit_actions_remove_url(struct client_state *csp, struct file_line * cur_line; struct file_line * prev_line; unsigned line_number; + unsigned section_start_line_number = 0; char * target; jb_err err; @@ -3607,6 +3732,10 @@ jb_err cgi_edit_actions_remove_url(struct client_state *csp, while ((cur_line != NULL) && (line_number < patternid)) { + if (cur_line->type == FILE_LINE_ACTION) + { + section_start_line_number = line_number; + } prev_line = cur_line; cur_line = cur_line->next; line_number++; @@ -3636,12 +3765,18 @@ jb_err cgi_edit_actions_remove_url(struct client_state *csp, if (err) { /* Error writing file */ + if (err == JB_ERR_FILE) + { + /* Read-only file. */ + err = cgi_error_file_read_only(csp, rsp, file->identifier); + } edit_free_file(file); return err; } target = strdup(CGI_PREFIX "edit-actions-list?f="); string_append(&target, file->identifier); + string_join(&target, section_target(section_start_line_number)); edit_free_file(file); @@ -3768,6 +3903,11 @@ jb_err cgi_edit_actions_section_remove(struct client_state *csp, if (err) { /* Error writing file */ + if (err == JB_ERR_FILE) + { + /* Read-only file. */ + err = cgi_error_file_read_only(csp, rsp, file->identifier); + } edit_free_file(file); return err; } @@ -3942,6 +4082,11 @@ jb_err cgi_edit_actions_section_add(struct client_state *csp, if (err) { /* Error writing file */ + if (err == JB_ERR_FILE) + { + /* Read-only file. */ + err = cgi_error_file_read_only(csp, rsp, file->identifier); + } edit_free_file(file); return err; } @@ -4140,6 +4285,11 @@ jb_err cgi_edit_actions_section_swap(struct client_state *csp, if (err) { /* Error writing file */ + if (err == JB_ERR_FILE) + { + /* Read-only file. */ + err = cgi_error_file_read_only(csp, rsp, file->identifier); + } edit_free_file(file); return err; }