[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Maxium command line args?
From: |
Forrest Aldrich |
Subject: |
Re: Maxium command line args? |
Date: |
Tue, 27 Feb 2001 09:35:26 -0500 |
At 09:28 AM 2/27/2001 -0500, Derek R. Price wrote:
Forrest Aldrich wrote:
> We have a series of scripts from quick.com.au that will assist us in
> managing our DNS pools. The author mentions that a patch may be required
> in order to avoid command line argument limitations, especially in the case
> of > 500 zones (which we have).
>
> I'm no FreeBSD-4.x (currently patched and updated) which has CVS
> 1.11. Does this problem still apply to version 1.11 of CVS? If so, do you
> have a patch that will run against this code (the one he has is older).
I'm not sure exactly how you think DNS pool management and CVS are related,
but most systems have a command line argument limitation. It's system
specific, but on my Linux system, the environment and the command line are
allowed to total something like 4096 bytes. This can't be fixed by patching
the executable.
Derek
--
Derek Price CVS Solutions Architect (
http://CVSHome.org )
mailto:address@hidden OpenAvenue ( http://OpenAvenue.com )
--
Was today really necessary?
[ ... ]
They are related if you USE cvs to manage your DNS pools.
For info on what I'm talking about, here's a patch. I just manually
applied it to the latest /usr/src/contrib/cvs/src/commit.c file on FreeBSD
and it's working.
The patch contains a preamble which will perhaps explain things better for
you. I'd appreciate any feedback or ideas about other ways to handle this
problem.
_F
...............................
Subject:
Pre-commit check failure due to too many args.
Date:
Tue, 8 Dec 1998 15:08:52 +1100 (EST)
From:
"Simon J. Gerraty" <address@hidden>
To:
address@hidden
CC:
address@hidden, address@hidden
Hi,
we use CVS to maintain our DNS data. We also use a DNS regression
suite (see http://www.quick.com.au/help/dns.html) to do pre-commit
checks - very handy.
The above toolset includes facilities for generating PTR records.
If/when we re-configure said tool, it can cause a few hundred in-addr
zone files to change.
This typically causes the pre-commit checks to fail as the OS command
line length is exceeded when cvs attempts to run the regression suite
in that directory.
The patch below (to cvs-1.10) modifies precommit_proc() such that if
the pre-commit filter command begins with "xargs" or _PATH_XARGS, then
it is run using run_popen() rather than run_exec().
I'm submitting it here in its first cut form to see what others think
(of the idea - not the code :-) It may be better forinstance to
always use run_popen() ? But for now this does the job.
--sjg
Index: commit.c
===================================================================
RCS file: /home/cvsroot/cvs/src/commit.c,v
retrieving revision 1.1.1.1
diff -c -b -r1.1.1.1 commit.c
*** commit.c 1998/12/08 01:08:38 1.1.1.1
--- commit.c 1998/12/08 03:16:36
***************
*** 1089,1100 ****
--- 1089,1104 ----
void *closure;
{
struct logfile_info *li;
+ FILE *fp = closure;
li = (struct logfile_info *) p->data;
if (li->type == T_ADDED
|| li->type == T_MODIFIED
|| li->type == T_REMOVED)
{
+ if (fp)
+ fprintf(fp, "'%s'\n", p->key);
+ else
run_arg (p->key);
}
return (0);
***************
*** 1108,1113 ****
--- 1112,1119 ----
char *repository;
char *filter;
{
+ int rc = -1;
+
/* see if the filter is there, only if it's a full path */
if (isabsolute (filter))
{
***************
*** 1129,1138 ****
free (s);
}
run_setup (filter);
run_arg (repository);
(void) walklist (saved_ulist, precommit_list_proc, NULL);
! return (run_exec (RUN_TTY, RUN_TTY, RUN_TTY, RUN_NORMAL|RUN_REALLY));
}
/*
--- 1135,1188 ----
free (s);
}
+ #ifndef _PATH_XARGS
+ # define _PATH_XARGS "/usr/bin/xargs"
+ #endif
+ if (strncmp(filter, _PATH_XARGS, sizeof(_PATH_XARGS) - 1) == 0
+ || strncmp(filter, "xargs", 5) == 0) {
+ /*
+ * we expect many args, so don't try run_exec()
+ */
+ char *cmd = xmalloc(strlen(filter) + strlen(repository) + 4);
+ if (cmd) {
+ FILE *fp;
+ int status = -1;
+
+ sprintf(cmd, "%s %s", filter, repository);
+
+ if (fp = run_popen(cmd, "w")) {
+ (void) walklist (saved_ulist,
precommit_list_proc, fp);
+ status = pclose(fp);
+ if (status != -1) {
+ /*
+ * from run_exec()
+ */
+ #ifndef VMS /* status is return status */
+ if (WIFEXITED (status))
+ rc = WEXITSTATUS (status);
+ else if (WIFSIGNALED (status))
+ {
+ if (WTERMSIG (status) == SIGPIPE)
+ error (1, 0, "broken
pipe");
+ rc = 2;
+ }
+ else
+ rc = 1;
+ #else /* VMS */
+ rc = WEXITSTATUS (status);
+ #endif /* VMS */
+ }
+ }
+ free(cmd);
+ }
+
+ } else {
run_setup (filter);
run_arg (repository);
(void) walklist (saved_ulist, precommit_list_proc, NULL);
! rc = run_exec (RUN_TTY, RUN_TTY, RUN_TTY, RUN_NORMAL|RUN_REALLY);
! }
! return rc;
}
/*