aboutsummaryrefslogtreecommitdiff
path: root/src/directive.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2020-04-10 21:04:21 +0300
committerSergey Poznyakoff <gray@gnu.org>2020-04-10 21:07:52 +0300
commita9da878ff22f980cea3bf3102113d7f2e65f61e9 (patch)
treedd3e21c580b91f6ab3d64e228ccb23170f3ddac3 /src/directive.c
parentda966c314f92d17b45ede9aa77ad3d3624c36725 (diff)
downloadwydawca-a9da878ff22f980cea3bf3102113d7f2e65f61e9.tar.gz
wydawca-a9da878ff22f980cea3bf3102113d7f2e65f61e9.tar.bz2
Change indentation to improve readability.
Diffstat (limited to 'src/directive.c')
-rw-r--r--src/directive.c997
1 files changed, 496 insertions, 501 deletions
diff --git a/src/directive.c b/src/directive.c
index 9989856..2aac9dc 100644
--- a/src/directive.c
+++ b/src/directive.c
@@ -22,40 +22,39 @@
int
directive_parse(struct wy_triplet *trp)
{
- size_t dcount, i, j;
- char *p;
-
- wy_debug(3, (_("%s: parsing directive blurb: %s"),
- trp->file[file_directive].name, trp->blurb));
-
- dcount = 0;
- for (p = trp->blurb; *p; p++)
- if (*p == '\n')
- dcount++;
-
- trp->directive = grecs_calloc(dcount + 1, sizeof trp->directive[0]);
- p = trp->blurb;
- for (i = j = 0; i < dcount; i++) {
- trp->directive[j] = p;
- p = strchr(p, '\n');
- if (p)
- *p++ = 0;
- if (trim(trp->directive[j]) == 0) /* ignore empty lines */
- continue;
- if (strchr(trp->directive[j], ':') == NULL) {
- wy_log(LOG_ERR, _("%s: invalid line: %s"),
- trp->file[file_directive].name,
- trp->directive[j]);
- free(trp->directive);
- trp->directive = NULL;
- return 1;
- }
- j++;
- if (!p)
- break;
+ size_t dcount, i, j;
+ char *p;
+
+ wy_debug(3, (_("%s: parsing directive blurb: %s"),
+ trp->file[file_directive].name, trp->blurb));
+
+ dcount = 0;
+ for (p = trp->blurb; *p; p++)
+ if (*p == '\n')
+ dcount++;
+
+ trp->directive = grecs_calloc(dcount + 1, sizeof trp->directive[0]);
+ p = trp->blurb;
+ for (i = j = 0; i < dcount; i++) {
+ trp->directive[j] = p;
+ p = strchr(p, '\n');
+ if (p)
+ *p++ = 0;
+ if (trim(trp->directive[j]) == 0) /* ignore empty lines */
+ continue;
+ if (strchr(trp->directive[j], ':') == NULL) {
+ wy_log(LOG_ERR, _("%s: invalid line: %s"),
+ trp->file[file_directive].name, trp->directive[j]);
+ free(trp->directive);
+ trp->directive = NULL;
+ return 1;
}
- trp->directive[j] = NULL;
- return 0;
+ j++;
+ if (!p)
+ break;
+ }
+ trp->directive[j] = NULL;
+ return 0;
}
/* If a directive KEY exists in the triplet TRP, return 0 and point PVAL
@@ -64,23 +63,23 @@ int
directive_get_value(struct wy_triplet const *trp, const char *key,
const char **pval)
{
- int keylen = strlen(key);
- int i;
-
- for (i = 0; trp->directive[i]; i++) {
- char *str = trp->directive[i];
- int len = strlen(str);
- if (len > keylen && memcmp(str, key, keylen) == 0
- && str[keylen] == ':') {
- str += keylen + 1;
- while (*str && isspace(*str))
- str++;
- if (pval)
- *pval = str;
- return 0;
- }
+ int keylen = strlen(key);
+ int i;
+
+ for (i = 0; trp->directive[i]; i++) {
+ char *str = trp->directive[i];
+ int len = strlen(str);
+ if (len > keylen && memcmp(str, key, keylen) == 0
+ && str[keylen] == ':') {
+ str += keylen + 1;
+ while (*str && isspace(*str))
+ str++;
+ if (pval)
+ *pval = str;
+ return 0;
}
- return 1;
+ }
+ return 1;
}
/* Auxiliary function for sequential access to directories from TRP.
@@ -97,34 +96,35 @@ static int
_directive_seq_get(int n, struct wy_triplet *trp,
const char **pkey, const char **pval)
{
- char *p;
- size_t len;
+ char *p;
+ size_t len;
- if (trp->directive[n] == NULL)
- return 0;
+ if (trp->directive[n] == NULL)
+ return 0;
- p = strchr(trp->directive[n], ':');
- len = p - trp->directive[n];
- if (len + 1 > trp->tmpsize) {
- trp->tmpsize = len + 1;
- trp->tmp = grecs_realloc(trp->tmp, trp->tmpsize);
- }
- memcpy(trp->tmp, trp->directive[n], len);
- trp->tmp[len] = 0;
- *pkey = trp->tmp;
- for (p++; *p && isspace(*p); p++) ;
- if (pval)
- *pval = p;
- return ++n;
+ p = strchr(trp->directive[n], ':');
+ len = p - trp->directive[n];
+ if (len + 1 > trp->tmpsize) {
+ trp->tmpsize = len + 1;
+ trp->tmp = grecs_realloc(trp->tmp, trp->tmpsize);
+ }
+ memcpy(trp->tmp, trp->directive[n], len);
+ trp->tmp[len] = 0;
+ *pkey = trp->tmp;
+ for (p++; *p && isspace(*p); p++);
+ if (pval)
+ *pval = p;
+ return ++n;
}
/* Get the first directive from TRP. Point *PKEY to its keyword and
*PVAL to its value. Return 1 on success, 0 on failure. */
int
-directive_first(struct wy_triplet *trp, const char **pkey, const char **pval)
+directive_first(struct wy_triplet *trp, const char **pkey,
+ const char **pval)
{
- int n = 0;
- return _directive_seq_get(n, trp, pkey, pval);
+ int n = 0;
+ return _directive_seq_get(n, trp, pkey, pval);
}
/* Get the first directive from TRP. Point *PKEY to its keyword and
@@ -134,33 +134,33 @@ int
directive_next(struct wy_triplet *trp, int n,
const char **pkey, const char **pval)
{
- return _directive_seq_get(n, trp, pkey, pval);
+ return _directive_seq_get(n, trp, pkey, pval);
}
/* Pack a directive string VAL into an unsigned number */
int
directive_pack_version(const char *val, unsigned *pversion)
{
- char *p;
- unsigned v;
+ char *p;
+ unsigned v;
- v = strtoul(val, &p, 10);
- if (*p != '.')
- return 1;
- p++;
- v *= 100;
- v += strtoul(p, &p, 10);
- if (*p && *p != '.')
- return 1;
- *pversion = v;
- return 0;
+ v = strtoul(val, &p, 10);
+ if (*p != '.')
+ return 1;
+ p++;
+ v *= 100;
+ v += strtoul(p, &p, 10);
+ if (*p && *p != '.')
+ return 1;
+ *pversion = v;
+ return 0;
}
int
directive_unpack_version(unsigned version, char **pbuf, size_t * psize)
{
- return grecs_asprintf(pbuf, psize, "%u.%u",
- version / 100, version % 100);
+ return grecs_asprintf(pbuf, psize, "%u.%u",
+ version / 100, version % 100);
}
/* Return true if the directory file version of the triplet TRP
@@ -169,510 +169,505 @@ int
directive_version_in_range_p(struct wy_triplet *trp,
unsigned from, unsigned to)
{
- const char *val;
- unsigned version;
+ const char *val;
+ unsigned version;
- if (directive_get_value(trp, "version", &val)) {
- wy_log(LOG_ERR, _("%s: missing `version' directive"),
- trp->file[file_directive].name);
- return 0;
- }
+ if (directive_get_value(trp, "version", &val)) {
+ wy_log(LOG_ERR, _("%s: missing `version' directive"),
+ trp->file[file_directive].name);
+ return 0;
+ }
- if (directive_pack_version(val, &version)) {
- wy_log(LOG_ERR, _("%s: unparsable version: %s"),
- trp->file[file_directive].name, val);
- return 0;
- }
- wy_log(LOG_NOTICE, _("%s: VERSION: %s"),
+ if (directive_pack_version(val, &version)) {
+ wy_log(LOG_ERR, _("%s: unparsable version: %s"),
trp->file[file_directive].name, val);
+ return 0;
+ }
+ wy_log(LOG_NOTICE, _("%s: VERSION: %s"),
+ trp->file[file_directive].name, val);
- trp->version = version;
+ trp->version = version;
- if (from <= version && version <= to)
- return 1;
+ if (from <= version && version <= to)
+ return 1;
- wy_log(LOG_ERR, _("%s: version %s is not in the allowed range"),
- trp->file[file_directive].name, val);
- return 0;
+ wy_log(LOG_ERR, _("%s: version %s is not in the allowed range"),
+ trp->file[file_directive].name, val);
+ return 0;
}
enum directive {
- unknown_dir,
- comment_dir,
- directory_dir,
- version_dir,
- filename_dir,
- rmsymlink_dir,
- archive_dir,
- symlink_dir,
- replace_dir
+ unknown_dir,
+ comment_dir,
+ directory_dir,
+ version_dir,
+ filename_dir,
+ rmsymlink_dir,
+ archive_dir,
+ symlink_dir,
+ replace_dir
};
struct directive_table {
- const char *name;
- enum directive dir;
+ const char *name;
+ enum directive dir;
};
static struct directive_table directive_table[] = {
- { "comment", comment_dir },
- { "directory", directory_dir },
- { "version", version_dir },
- { "filename", filename_dir },
- { "symlink", symlink_dir },
- { "rmsymlink", rmsymlink_dir },
- { "archive", archive_dir },
- { "replace", replace_dir },
- { NULL }
+ {"comment", comment_dir},
+ {"directory", directory_dir},
+ {"version", version_dir},
+ {"filename", filename_dir},
+ {"symlink", symlink_dir},
+ {"rmsymlink", rmsymlink_dir},
+ {"archive", archive_dir},
+ {"replace", replace_dir},
+ {NULL}
};
static enum directive
find_directive(const char *key)
{
- int i;
+ int i;
- for (i = 0; directive_table[i].name; i++)
- if (strcmp(directive_table[i].name, key) == 0)
- return directive_table[i].dir;
- return unknown_dir;
+ for (i = 0; directive_table[i].name; i++)
+ if (strcmp(directive_table[i].name, key) == 0)
+ return directive_table[i].dir;
+ return unknown_dir;
}
/* Return 0 if the directory file format of the triplet TRP is OK. */
int
verify_directive_format(struct wy_triplet *trp)
{
- int n, dnum;
- const char *key;
+ int n, dnum;
+ const char *key;
- if (!directive_version_in_range_p(trp, min_directive_version,
- max_directive_version))
+ if (!directive_version_in_range_p(trp, min_directive_version,
+ max_directive_version))
+ return 1;
+
+ dnum = 0;
+ for (n = directive_first(trp, &key, NULL); n;
+ n = directive_next(trp, n, &key, NULL)) {
+ if (strcmp(key, "comment") == 0)
+ continue;
+ dnum++;
+ switch (dnum) {
+ case 1:
+ if (strcmp(key, "version")) {
+ wy_log(LOG_ERR,
+ _("%s:%d: expected `%s' but found `%s'"),
+ trp->file[file_directive].name, n, "version", key);
return 1;
+ }
+ break;
- dnum = 0;
- for (n = directive_first(trp, &key, NULL); n;
- n = directive_next(trp, n, &key, NULL)) {
- if (strcmp(key, "comment") == 0)
- continue;
- dnum++;
- switch (dnum) {
- case 1:
- if (strcmp(key, "version")) {
- wy_log(LOG_ERR,
- _("%s:%d: expected `%s' but found `%s'"),
- trp->file[file_directive].name, n,
- "version", key);
- return 1;
- }
- break;
-
- case 2:
- if (strcmp(key, "directory")) {
- wy_log(LOG_ERR,
- _("%s:%d: expected `%s' but found `%s'"),
- trp->file[file_directive].name, n,
- "directory", key);
- return 1;
- }
- break;
-
- default:
- if (find_directive(key) == unknown_dir) {
- wy_log(LOG_ERR,
- _("%s:%d: unknown directive `%s'"),
- trp->file[file_directive].name, n, key);
- return 1;
- }
- }
- }
+ case 2:
+ if (strcmp(key, "directory")) {
+ wy_log(LOG_ERR,
+ _("%s:%d: expected `%s' but found `%s'"),
+ trp->file[file_directive].name, n,
+ "directory", key);
+ return 1;
+ }
+ break;
- if (trp->file[file_dist].name && trp->file[file_signature].name) {
- const char *filename;
- if (directive_get_value(trp, "filename", &filename)) {
- wy_log(LOG_ERR, _("%s: missing `filename' directive"),
- trp->file[file_directive].name);
- return 1;
- }
- if (strcmp(filename, trp->file[file_dist].name)) {
- wy_log(LOG_ERR,
- _("%s: filename %s does not match actual name"),
- trp->file[file_dist].name, filename);
- return 1;
- }
+ default:
+ if (find_directive(key) == unknown_dir) {
+ wy_log(LOG_ERR,
+ _("%s:%d: unknown directive `%s'"),
+ trp->file[file_directive].name, n, key);
+ return 1;
+ }
}
- return 0;
+ }
+
+ if (trp->file[file_dist].name && trp->file[file_signature].name) {
+ const char *filename;
+ if (directive_get_value(trp, "filename", &filename)) {
+ wy_log(LOG_ERR, _("%s: missing `filename' directive"),
+ trp->file[file_directive].name);
+ return 1;
+ }
+ if (strcmp(filename, trp->file[file_dist].name)) {
+ wy_log(LOG_ERR,
+ _("%s: filename %s does not match actual name"),
+ trp->file[file_dist].name, filename);
+ return 1;
+ }
+ }
+ return 0;
}
static char *
save_script(const char *script)
{
- char *file_name;
- mode_t old_mask;
- int fd;
- size_t length;
-
- file_name = concat_dir(temp_homedir, "chkXXXXXX", NULL);
- old_mask = umask(0077);
- fd = mkstemp(file_name);
- umask(old_mask);
- if (fd == -1) {
- wy_log(LOG_CRIT,
- _("cannot create temporary script file %s: %s"),
- file_name, strerror(errno));
- free(file_name);
- return NULL;
- }
-
- length = strlen(script);
- while (length) {
- ssize_t wrb = write(fd, script, length);
- if (wrb == -1) {
- wy_log(LOG_CRIT,
- _("error writing to temporary script "
- "file %s: %s"),
- file_name, strerror(errno));
- break;
- }
- if (wrb == 0) {
- wy_log(LOG_CRIT,
- _("short write to temporary script file %s"),
- file_name);
- break;
- }
-
- length -= wrb;
- script += wrb;
+ char *file_name;
+ mode_t old_mask;
+ int fd;
+ size_t length;
+
+ file_name = concat_dir(temp_homedir, "chkXXXXXX", NULL);
+ old_mask = umask(0077);
+ fd = mkstemp(file_name);
+ umask(old_mask);
+ if (fd == -1) {
+ wy_log(LOG_CRIT,
+ _("cannot create temporary script file %s: %s"),
+ file_name, strerror(errno));
+ free(file_name);
+ return NULL;
+ }
+
+ length = strlen(script);
+ while (length) {
+ ssize_t wrb = write(fd, script, length);
+ if (wrb == -1) {
+ wy_log(LOG_CRIT,
+ _("error writing to temporary script "
+ "file %s: %s"), file_name, strerror(errno));
+ break;
}
- close(fd);
- if (length) {
- free(file_name);
- return NULL;
+ if (wrb == 0) {
+ wy_log(LOG_CRIT,
+ _("short write to temporary script file %s"),
+ file_name);
+ break;
}
- return file_name;
+
+ length -= wrb;
+ script += wrb;
+ }
+ close(fd);
+ if (length) {
+ free(file_name);
+ return NULL;
+ }
+ return file_name;
}
static int
stderr_redirector(const char *tag)
{
- int p[2];
- pid_t pid;
+ int p[2];
+ pid_t pid;
- if (pipe(p)) {
- wy_log(LOG_CRIT, "redirector pipe: %s", strerror(errno));
- return -1;
- }
+ if (pipe(p)) {
+ wy_log(LOG_CRIT, "redirector pipe: %s", strerror(errno));
+ return -1;
+ }
- pid = fork();
- if (pid == -1) {
- wy_log(LOG_CRIT, "redirector fork: %s", strerror(errno));
- return -1;
- }
+ pid = fork();
+ if (pid == -1) {
+ wy_log(LOG_CRIT, "redirector fork: %s", strerror(errno));
+ return -1;
+ }
- if (pid == 0) {
- FILE *fp;
- size_t size = 0;
- char *buf = NULL;
-
- close(p[1]);
- fp = fdopen(p[0], "r");
- if (!fp)
- _exit(127);
- while (grecs_getline(&buf, &size, fp) >= 0) {
- trim_crlf(buf);
- wy_log(LOG_NOTICE, "%s: %s", tag, buf);
- }
- _exit(0);
+ if (pid == 0) {
+ FILE *fp;
+ size_t size = 0;
+ char *buf = NULL;
+
+ close(p[1]);
+ fp = fdopen(p[0], "r");
+ if (!fp)
+ _exit(127);
+ while (grecs_getline(&buf, &size, fp) >= 0) {
+ trim_crlf(buf);
+ wy_log(LOG_NOTICE, "%s: %s", tag, buf);
}
+ _exit(0);
+ }
- close(p[0]);
- return p[1];
+ close(p[0]);
+ return p[1];
}
static int
run_check_script(const char *script, struct wy_triplet *trp,
const char *descr)
{
- static char *script_file;
- pid_t pid;
- int status;
- int p[2];
- RETSIGTYPE(*oldsig) ();
- FILE *fp;
- char *buf;
- size_t size, total;
-
- wy_debug(2, (_("prep script: %20.20s%s"),
- script, strlen(script) > 20 ? "..." : ""));
- script_file = save_script(script);
- if (!script_file)
- return 1;
- wy_debug(2, (_("script file: %s"), script_file));
-
- if (pipe(p)) {
- wy_log(LOG_CRIT, "pipe: %s", strerror(errno));
- return 1;
- }
- oldsig = signal(SIGCHLD, SIG_DFL);
- pid = fork();
- if (pid == -1) {
- wy_log(LOG_CRIT, "fork: %s", strerror(errno));
- free(script_file);
- close(p[0]);
- close(p[1]);
- signal(SIGCHLD, oldsig);
- return 1;
- }
- if (pid == 0) {
- int i;
- int efd;
- char *argv[4];
- const struct spool *spool = trp->spool;
-
- signal(SIGHUP, SIG_DFL);
- signal(SIGTERM, SIG_DFL);
- signal(SIGQUIT, SIG_DFL);
- signal(SIGINT, SIG_DFL);
- signal(SIGCHLD, SIG_DFL);
- signal(SIGALRM, SIG_DFL);
-
- efd = stderr_redirector(script_file);
- if (efd == -1)
- _exit(127);
-
- for (i = getdtablesize(); i >= 0; i--) {
- if (i != p[1] && i != efd)
- close(i);
- }
-
- if (p[1] != 1 && dup2(p[1], 1) != 1) {
- wy_log(LOG_CRIT,
- "cannot duplicate script's stdout: %s",
- strerror(errno));
- _exit(127);
- }
-
- if (efd != 2 && dup2(efd, 2) != 2) {
- wy_log(LOG_CRIT,
- "cannot duplicate script's stderr: %s",
- strerror(errno));
- _exit(127);
- }
-
- setenv("WYDAWCA_SPOOL", spool->tag, 1);
- setenv("WYDAWCA_SOURCE", spool->source_dir, 1);
- setenv("WYDAWCA_DEST", wy_url_path(spool->dest_url), 1);
- setenv("WYDAWCA_URL", spool->url, 1);
- setenv("WYDAWCA_TRIPLET_BASE", trp->name, 1);
- setenv("WYDAWCA_DIST_FILE", trp->file[file_dist].name, 1);
-
- if (chdir(temp_homedir)) {
- wy_log(LOG_CRIT, "cannot change to %s: %s",
- temp_homedir, strerror(errno));
- _exit(127);
- }
-
- argv[0] = "sh";
- argv[1] = script_file;
- argv[2] = NULL;
-
- execv("/bin/sh", argv);
- _exit(127);
- }
+ static char *script_file;
+ pid_t pid;
+ int status;
+ int p[2];
+ RETSIGTYPE(*oldsig) ();
+ FILE *fp;
+ char *buf;
+ size_t size, total;
+
+ wy_debug(2, (_("prep script: %20.20s%s"),
+ script, strlen(script) > 20 ? "..." : ""));
+ script_file = save_script(script);
+ if (!script_file)
+ return 1;
+ wy_debug(2, (_("script file: %s"), script_file));
- /* Master */
+ if (pipe(p)) {
+ wy_log(LOG_CRIT, "pipe: %s", strerror(errno));
+ return 1;
+ }
+ oldsig = signal(SIGCHLD, SIG_DFL);
+ pid = fork();
+ if (pid == -1) {
+ wy_log(LOG_CRIT, "fork: %s", strerror(errno));
free(script_file);
+ close(p[0]);
close(p[1]);
- fp = fdopen(p[0], "r");
- buf = NULL;
- size = total = 0;
- wy_debug(3, (_("reading script output...")));
- while (grecs_getline(&buf, &size, fp) > 0) {
- size_t len = strlen(buf);
- wy_debug(3, (_("read: %s"), buf));
- grecs_txtacc_grow(trp->acc, buf, len);
- total += size;
+ signal(SIGCHLD, oldsig);
+ return 1;
+ }
+ if (pid == 0) {
+ int i;
+ int efd;
+ char *argv[4];
+ const struct spool *spool = trp->spool;
+
+ signal(SIGHUP, SIG_DFL);
+ signal(SIGTERM, SIG_DFL);
+ signal(SIGQUIT, SIG_DFL);
+ signal(SIGINT, SIG_DFL);
+ signal(SIGCHLD, SIG_DFL);
+ signal(SIGALRM, SIG_DFL);
+
+ efd = stderr_redirector(script_file);
+ if (efd == -1)
+ _exit(127);
+
+ for (i = getdtablesize(); i >= 0; i--) {
+ if (i != p[1] && i != efd)
+ close(i);
}
- grecs_txtacc_grow_char(trp->acc, 0);
- wy_debug(3, (_("bytes read: %lu"), (unsigned long)total));
- fclose(fp);
+ if (p[1] != 1 && dup2(p[1], 1) != 1) {
+ wy_log(LOG_CRIT,
+ "cannot duplicate script's stdout: %s",
+ strerror(errno));
+ _exit(127);
+ }
- waitpid(pid, &status, 0);
- signal(SIGCHLD, oldsig);
+ if (efd != 2 && dup2(efd, 2) != 2) {
+ wy_log(LOG_CRIT,
+ "cannot duplicate script's stderr: %s",
+ strerror(errno));
+ _exit(127);
+ }
- if (total)
- trp->check_diag = grecs_txtacc_finish(trp->acc, 0);
- else
- grecs_txtacc_clear(trp->acc);
-
- trp->check_result = status;
- if (WIFEXITED(status)) {
- status = WEXITSTATUS(status);
- if (status) {
- wy_log(LOG_ERR, "%s for %s@%s returned %d",
- descr, trp->name, trp->spool->tag, status);
- return 1;
- } else
- wy_debug(3, ("%s for %s@%s returned %d",
- descr, trp->name, trp->spool->tag, status));
- } else if (WIFSIGNALED(status)) {
- int sig = WTERMSIG(status);
- wy_log(LOG_NOTICE,
- "%s for %s@%s terminated on signal %d",
- descr, trp->name, trp->spool->tag, sig);
- return 1;
- } else {
- wy_log(LOG_NOTICE,
- "%s for %s@%s terminated with unhandled status",
- descr, trp->name, trp->spool->tag);
- return 1;
+ setenv("WYDAWCA_SPOOL", spool->tag, 1);
+ setenv("WYDAWCA_SOURCE", spool->source_dir, 1);
+ setenv("WYDAWCA_DEST", wy_url_path(spool->dest_url), 1);
+ setenv("WYDAWCA_URL", spool->url, 1);
+ setenv("WYDAWCA_TRIPLET_BASE", trp->name, 1);
+ setenv("WYDAWCA_DIST_FILE", trp->file[file_dist].name, 1);
+
+ if (chdir(temp_homedir)) {
+ wy_log(LOG_CRIT, "cannot change to %s: %s",
+ temp_homedir, strerror(errno));
+ _exit(127);
}
- return 0;
+
+ argv[0] = "sh";
+ argv[1] = script_file;
+ argv[2] = NULL;
+
+ execv("/bin/sh", argv);
+ _exit(127);
+ }
+
+ /* Master */
+ free(script_file);
+ close(p[1]);
+ fp = fdopen(p[0], "r");
+ buf = NULL;
+ size = total = 0;
+ wy_debug(3, (_("reading script output...")));
+ while (grecs_getline(&buf, &size, fp) > 0) {
+ size_t len = strlen(buf);
+ wy_debug(3, (_("read: %s"), buf));
+ grecs_txtacc_grow(trp->acc, buf, len);
+ total += size;
+ }
+ grecs_txtacc_grow_char(trp->acc, 0);
+ wy_debug(3, (_("bytes read: %lu"), (unsigned long) total));
+
+ fclose(fp);
+
+ waitpid(pid, &status, 0);
+ signal(SIGCHLD, oldsig);
+
+ if (total)
+ trp->check_diag = grecs_txtacc_finish(trp->acc, 0);
+ else
+ grecs_txtacc_clear(trp->acc);
+
+ trp->check_result = status;
+ if (WIFEXITED(status)) {
+ status = WEXITSTATUS(status);
+ if (status) {
+ wy_log(LOG_ERR, "%s for %s@%s returned %d",
+ descr, trp->name, trp->spool->tag, status);
+ return 1;
+ } else
+ wy_debug(3, ("%s for %s@%s returned %d",
+ descr, trp->name, trp->spool->tag, status));
+ } else if (WIFSIGNALED(status)) {
+ int sig = WTERMSIG(status);
+ wy_log(LOG_NOTICE,
+ "%s for %s@%s terminated on signal %d",
+ descr, trp->name, trp->spool->tag, sig);
+ return 1;
+ } else {
+ wy_log(LOG_NOTICE,
+ "%s for %s@%s terminated with unhandled status",
+ descr, trp->name, trp->spool->tag);
+ return 1;
+ }
+ return 0;
}
static int
external_check(struct wy_triplet *trp)
{
- int rc;
- const struct spool *spool = trp->spool;
- char *file;
+ int rc;
+ const struct spool *spool = trp->spool;
+ char *file;
- if (!trp->file[file_dist].name)
- return 0;
- if (!spool->check_script && !default_check_script)
- return 0;
+ if (!trp->file[file_dist].name)
+ return 0;
+ if (!spool->check_script && !default_check_script)
+ return 0;
- file = concat_dir(temp_homedir, trp->file[file_dist].name, NULL);
- if (copy_file(trp->file[file_dist].name, file)) {
- free(file);
- return 1;
- }
+ file = concat_dir(temp_homedir, trp->file[file_dist].name, NULL);
+ if (copy_file(trp->file[file_dist].name, file)) {
+ free(file);
+ return 1;
+ }
- rc = 0;
- if (spool->check_script)
- rc |= run_check_script(spool->check_script, trp,
- _("spool check script"));
+ rc = 0;
+ if (spool->check_script)
+ rc |= run_check_script(spool->check_script, trp,
+ _("spool check script"));
- if (rc == 0 && default_check_script)
- rc |= run_check_script(default_check_script, trp,
- _("default check script"));
+ if (rc == 0 && default_check_script)
+ rc |= run_check_script(default_check_script, trp,
+ _("default check script"));
- free(file);
+ free(file);
- if (rc) {
- UPDATE_STATS(WY_STAT_CHECK_FAIL);
- notify(spool->notification, trp, wy_ev_check_fail);
- }
+ if (rc) {
+ UPDATE_STATS(WY_STAT_CHECK_FAIL);
+ notify(spool->notification, trp, wy_ev_check_fail);
+ }
- return rc;
+ return rc;
}
static int
symlink_filelist(struct wy_triplet *trp, const char *key, const char *val)
{
- int rc = 0;
- struct wordsplit ws;
+ int rc = 0;
+ struct wordsplit ws;
- if (wordsplit(val, &ws, WRDSF_DEFFLAGS)) {
- wy_log(LOG_ERR,
- _("cannot parse symlink value `%s'"), val);
- return 1;
- }
-
- if (ws.ws_wordc != 2) {
- rc = 1;
- wy_log(LOG_ERR,
- _("wrong number of arguments to %s directive: `%s'"),
- key, val);
- } else
- rc = symlink_file(trp, ws.ws_wordv[0], ws.ws_wordv[1]);
-
- wordsplit_free(&ws);
- return rc;
+ if (wordsplit(val, &ws, WRDSF_DEFFLAGS)) {
+ wy_log(LOG_ERR, _("cannot parse symlink value `%s'"), val);
+ return 1;
+ }
+
+ if (ws.ws_wordc != 2) {
+ rc = 1;
+ wy_log(LOG_ERR,
+ _("wrong number of arguments to %s directive: `%s'"),
+ key, val);
+ } else
+ rc = symlink_file(trp, ws.ws_wordv[0], ws.ws_wordv[1]);
+
+ wordsplit_free(&ws);
+ return rc;
}
/* Process the directives from TRP */
int
process_directives(struct wy_triplet *trp)
{
- int rc, n;
- const char *key, *val;
- const struct spool *spool;
-
- ASGN_SPOOL(spool, trp, return 1);
- UPDATE_STATS(WY_STAT_COMPLETE_TRIPLETS);
- timer_start("triplet");
- report_init();
- for (n = directive_first(trp, &key, &val); n;
- n = directive_next(trp, n, &key, &val)) {
- enum directive d = find_directive(key);
- switch (d) {
- case unknown_dir:
- /* should not happen */
- abort();
-
- case comment_dir:
- wy_log(LOG_NOTICE, _("%s: COMMENT: %s"),
- trp->file[file_directive].name, val);
- break;
-
- case directory_dir:
- /* already processed (see fill_project_name in
- verify.c */
- break;
-
- case filename_dir:
- rc = verify_detached_signature(trp);
- if (rc == 0) {
- if (external_check(trp))
- return 1;
- if (move_file(trp, file_dist) ||
- move_file(trp, file_signature))
- return 1;
- } else {
- wy_log(LOG_ERR,
- _("invalid detached signature for %s"),
- trp->name);
- return 1;
- }
- break;
-
- case version_dir:
- /* Already processed. See directive_version_in_range_p,
- called by verify_directive_format */
- break;
-
- case archive_dir:
- if (archive_file(trp, val))
- return 1;
- break;
-
- case symlink_dir:
- if (symlink_filelist(trp, key, val))
- return 1;
- break;
-
- case rmsymlink_dir:
- if (rmsymlink_file(trp, val))
- return 1;
-
- case replace_dir:
- if (trp->version < 102) {
- rc = 1;
- wy_log(LOG_ERR,
- _("\"replace\" directive is invalid "
- "for version %d"),
- trp->version);
- }
- }
- }
+ int rc, n;
+ const char *key, *val;
+ const struct spool *spool;
+
+ ASGN_SPOOL(spool, trp, return 1);
+ UPDATE_STATS(WY_STAT_COMPLETE_TRIPLETS);
+ timer_start("triplet");
+ report_init();
+ for (n = directive_first(trp, &key, &val); n;
+ n = directive_next(trp, n, &key, &val)) {
+ enum directive d = find_directive(key);
+ switch (d) {
+ case unknown_dir:
+ /* should not happen */
+ abort();
+
+ case comment_dir:
+ wy_log(LOG_NOTICE, _("%s: COMMENT: %s"),
+ trp->file[file_directive].name, val);
+ break;
+
+ case directory_dir:
+ /* already processed (see fill_project_name in
+ verify.c */
+ break;
+
+ case filename_dir:
+ rc = verify_detached_signature(trp);
+ if (rc == 0) {
+ if (external_check(trp))
+ return 1;
+ if (move_file(trp, file_dist) ||
+ move_file(trp, file_signature))
+ return 1;
+ } else {
+ wy_log(LOG_ERR,
+ _("invalid detached signature for %s"), trp->name);
+ return 1;
+ }
+ break;
- if (!wy_dry_run && unlink(trp->file[file_directive].name)) {
- wy_log(LOG_CRIT, _("%s: cannot unlink directive file: %s"),
- trp->file[file_directive].name, strerror(errno));
- }
+ case version_dir:
+ /* Already processed. See directive_version_in_range_p,
+ * called by verify_directive_format */
+ break;
- UPDATE_STATS(WY_STAT_TRIPLET_SUCCESS);
- report_finish();
- timer_stop("triplet");
- notify(spool->notification, trp, wy_ev_success);
- return 0;
+ case archive_dir:
+ if (archive_file(trp, val))
+ return 1;
+ break;
+
+ case symlink_dir:
+ if (symlink_filelist(trp, key, val))
+ return 1;
+ break;
+
+ case rmsymlink_dir:
+ if (rmsymlink_file(trp, val))
+ return 1;
+
+ case replace_dir:
+ if (trp->version < 102) {
+ rc = 1;
+ wy_log(LOG_ERR,
+ _("\"replace\" directive is invalid "
+ "for version %d"), trp->version);
+ }
+ }
+ }
+
+ if (!wy_dry_run && unlink(trp->file[file_directive].name)) {
+ wy_log(LOG_CRIT, _("%s: cannot unlink directive file: %s"),
+ trp->file[file_directive].name, strerror(errno));
+ }
+
+ UPDATE_STATS(WY_STAT_TRIPLET_SUCCESS);
+ report_finish();
+ timer_stop("triplet");
+ notify(spool->notification, trp, wy_ev_success);
+ return 0;
}

Return to:

Send suggestions and report system problems to the System administrator.