[Crash-utility] Miscellaneous fixes/enhancements to crash 4.0-2.10(fwd)

Dave Anderson anderson at redhat.com
Fri Nov 18 15:59:26 UTC 2005


Dave Anderson wrote:

>
> Well, first off, it's kind of stupid to run the same .crashrc file twice,
> isn't it?  I shall fix that oversight henceforth...
>
> That leaves the case where "bt -O" is set in both the $HOME and
> local .crashrc files.  Whereas the local .crashrc is meant to override
> whatever might be in the $HOME .crashrc, the "bt -O" case still wants
> to be idempotent.  That can be addressed by a little tinkering with cmd_bt(),
> because the pc->flags will have RCHOME_IFILE or RCLOCAL_IFILE
> set when it's executing those .crashrc commands.
>
> With those two fixes in hand, we can keep "bt -O" simple-minded.

There's also the potential case of the command line "-i inputfile" option.
But the initialization-time rule should still apply -- if "bt -O" is contained in
any or all of the 3 possible initialization-time input files ($HOME/.crashrc,
./.crashrc, or "-i inputfile" files), the setting will remain idempotent.

I also fixed the redundant running of $HOME/.crashrc and ./.crashrc
files if they are the same file.

Thanks,
  Dave

-------------- next part --------------
Index: cmdline.c
===================================================================
RCS file: /nfs/projects/cvs/crash/cmdline.c,v
retrieving revision 1.15
diff -u -p -r1.15 cmdline.c
--- cmdline.c	13 Apr 2005 20:48:17 -0000	1.15
+++ cmdline.c	18 Nov 2005 15:49:59 -0000
@@ -71,14 +71,17 @@ get_command_line(void)
 	 *    4. from a terminal.
 	 *    5. from a pipe, if stdin is a pipe rather than a terminal.
 	 */
-	if (pc->flags & RCHOME_IFILE)  
+	if (pc->flags & RCHOME_IFILE) {
                 sprintf(pc->command_line, "< %s/.%src", 
 			pc->home, pc->program_name);
-	else if (pc->flags & RCLOCAL_IFILE) 
+		pc->flags |= INIT_IFILE;
+	} else if (pc->flags & RCLOCAL_IFILE) { 
                 sprintf(pc->command_line, "< .%src", pc->program_name);
-	else if (pc->flags & CMDLINE_IFILE) 
+		pc->flags |= INIT_IFILE;
+	} else if (pc->flags & CMDLINE_IFILE) {
 		sprintf(pc->command_line, "< %s", pc->input_file);
-	else if (pc->flags & TTY) {
+		pc->flags |= INIT_IFILE;
+	} else if (pc->flags & TTY) {
 		if (!(pc->readline = readline(pc->prompt))) {
 			args[0] = NULL;
 			fprintf(fp, "\n");
@@ -918,7 +921,7 @@ restore_sanity(void)
 
 	wait_for_children(ZOMBIES_ONLY);
 
-	pc->flags &= ~(RUNTIME_IFILE|_SIGINT_);
+	pc->flags &= ~(INIT_IFILE|RUNTIME_IFILE|_SIGINT_);
 	pc->sigint_cnt = 0;
 	pc->redirect = 0;
 	pc->pipe_command[0] = NULLCHAR;
Index: defs.h
===================================================================
RCS file: /nfs/projects/cvs/crash/defs.h,v
retrieving revision 1.238
diff -u -p -r1.238 defs.h
--- defs.h	10 Nov 2005 20:25:45 -0000	1.238
+++ defs.h	18 Nov 2005 15:40:07 -0000
@@ -169,6 +169,7 @@ struct number_option {
 #define VERSION_QUERY   (0x4000000000000ULL)
 #define READNOW         (0x8000000000000ULL)
 #define NOCRASHRC      (0x10000000000000ULL)
+#define INIT_IFILE     (0x20000000000000ULL)
 
 #define ACTIVE()            (pc->flags & LIVE_SYSTEM)
 #define DUMPFILE()          (!(pc->flags & LIVE_SYSTEM))
Index: kernel.c
===================================================================
RCS file: /nfs/projects/cvs/crash/kernel.c,v
retrieving revision 1.129
diff -u -p -r1.129 kernel.c
--- kernel.c	10 Nov 2005 20:22:33 -0000	1.129
+++ kernel.c	18 Nov 2005 15:54:23 -0000
@@ -1156,9 +1156,19 @@ cmd_bt(void)
 			break;
 
 		case 'O':
-			if (!(machine_type("X86"))) {
+			if (!machine_type("X86")) 
 				option_not_supported(c);
-			} else if (kt->flags & USE_OLD_BT) { 
+			else if (kt->flags & USE_OLD_BT) { 
+				/* 
+				 *  Make this setting idempotent across the use of
+				 *  $HOME/.crashrc, ./.crashrc, and "-i input" files. 
+				 *  If we've been here before during initialization,
+				 *  leave it alone.
+			 	 */
+				if (pc->flags & INIT_IFILE) {
+					error(INFO, "use old bt method by default (already set)\n");
+					return;
+				}
 				kt->flags &= ~USE_OLD_BT;
 				error(INFO, "use new bt method by default\n");
 			} else {
Index: main.c
===================================================================
RCS file: /nfs/projects/cvs/crash/main.c,v
retrieving revision 1.50
diff -u -p -r1.50 main.c
--- main.c	15 Sep 2005 19:39:58 -0000	1.50
+++ main.c	18 Nov 2005 15:41:07 -0000
@@ -606,6 +606,8 @@ setup_environment(int argc, char **argv)
 	int i;
 	char *p1;
 	char buf[BUFSIZE];
+	char homerc[BUFSIZE];
+	char localrc[BUFSIZE];
 	FILE *afp;
 	char *program;
 
@@ -700,11 +702,11 @@ setup_environment(int argc, char **argv)
 			pc->home = "(unknown)";
 		} else
 			strcpy(pc->home, p1);
-	        sprintf(buf, "%s/.%src", pc->home, pc->program_name);
-	        if (!(pc->flags & NOCRASHRC) && file_exists(buf, NULL)) {
-	                if ((afp = fopen(buf, "r")) == NULL)
+	        sprintf(homerc, "%s/.%src", pc->home, pc->program_name);
+	        if (!(pc->flags & NOCRASHRC) && file_exists(homerc, NULL)) {
+	                if ((afp = fopen(homerc, "r")) == NULL)
 	                        error(INFO, "cannot open %s: %s\n",
-	                                buf, strerror(errno));
+	                                homerc, strerror(errno));
 	                else {
 	                        while (fgets(buf, BUFSIZE, afp))
 	                                resolve_rc_cmd(buf, ALIAS_RCHOME);
@@ -713,11 +715,12 @@ setup_environment(int argc, char **argv)
 	        }
 	}
 
-        sprintf(buf, ".%src", pc->program_name);
-	if (!(pc->flags & NOCRASHRC) && file_exists(buf, NULL)) {
-		if ((afp = fopen(buf, "r")) == NULL)
+        sprintf(localrc, ".%src", pc->program_name);
+	if (!same_file(homerc, localrc) && 
+	    !(pc->flags & NOCRASHRC) && file_exists(localrc, NULL)) {
+		if ((afp = fopen(localrc, "r")) == NULL)
                         error(INFO, "cannot open %s: %s\n",
-				buf, strerror(errno));
+				localrc, strerror(errno));
 		else {
 			while (fgets(buf, BUFSIZE, afp)) 
 				resolve_rc_cmd(buf, ALIAS_RCLOCAL);
@@ -891,6 +894,9 @@ dump_program_context(void)
         if (pc->flags & NOCRASHRC)
                 sprintf(&buf[strlen(buf)],
                         "%sNOCRASHRC", others++ ? "|" : "");
+        if (pc->flags & INIT_IFILE)
+                sprintf(&buf[strlen(buf)],
+                        "%sINIT_IFILE", others++ ? "|" : "");
 
 	if (pc->flags)
 		strcat(buf, ")");


More information about the Crash-utility mailing list