-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 $
*
* 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
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);
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<n>, 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
struct editable_file * file;
struct file_line * cur_line;
unsigned line_number;
+ unsigned section_start_line_number = 0;
jb_err err;
assert(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;
}
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);
struct editable_file * file;
struct file_line * cur_line;
unsigned line_number;
+ unsigned section_start_line_number = 0;
jb_err err;
assert(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;
}
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);
}
+/*********************************************************************
+ *
+ * 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
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);
struct editable_file * file;
struct file_line * cur_line;
unsigned line_number;
+ unsigned section_start_line_number = 0;
char * target;
jb_err err;
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++;
}
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);
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);
struct file_line * cur_line;
struct file_line * prev_line;
unsigned line_number;
+ unsigned section_start_line_number = 0;
char * target;
jb_err err;
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++;
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);
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;
}
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;
}
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;
}