plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

cmdline.c (3559B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <mach.h>
      4 
      5 Fhdr *symhdr;
      6 Fhdr *corhdr;
      7 char *symfil;
      8 char *corfil;
      9 int corpid;
     10 Regs *correg;
     11 Map *symmap;
     12 Map *cormap;
     13 
     14 static int
     15 alldigs(char *s)
     16 {
     17 	while(*s){
     18 		if(*s<'0' || '9'<*s)
     19 			return 0;
     20 		s++;
     21 	}
     22 	return 1;
     23 }
     24 
     25 /*
     26  * attach to arguments in argc, argv
     27  */
     28 int
     29 attachargs(int argc, char **argv, int omode, int verbose)
     30 {
     31 	int i;
     32 	Fhdr *hdr;
     33 	char *s, *t;
     34 
     35 	symhdr = nil;
     36 	corhdr = nil;
     37 	symfil = nil;
     38 	corfil = nil;
     39 	corpid = 0;
     40 	correg = nil;
     41 
     42 	for(i=0; i<argc; i++){
     43 		if(alldigs(argv[i])){
     44 			if(corpid){
     45 				fprint(2, "already have corpid %d; ignoring corpid %d\n", corpid, argv[i]);
     46 				continue;
     47 			}
     48 			if(corhdr){
     49 				fprint(2, "already have core %s; ignoring corpid %d\n", corfil, corpid);
     50 				continue;
     51 			}
     52 			corpid = atoi(argv[i]);
     53 			continue;
     54 		}
     55 		if((hdr = crackhdr(argv[i], omode)) == nil){
     56 			fprint(2, "crackhdr %s: %r\n", argv[i]);
     57 			continue;
     58 		}
     59 		if(verbose)
     60 			fprint(2, "%s: %s %s %s\n", argv[i], hdr->aname, hdr->mname, hdr->fname);
     61 		if(hdr->ftype == FCORE){
     62 			if(corpid){
     63 				fprint(2, "already have corpid %d; ignoring core %s\n", corpid, argv[i]);
     64 				uncrackhdr(hdr);
     65 				continue;
     66 			}
     67 			if(corhdr){
     68 				fprint(2, "already have core %s; ignoring core %s\n", corfil, argv[i]);
     69 				uncrackhdr(hdr);
     70 				continue;
     71 			}
     72 			corhdr = hdr;
     73 			corfil = argv[i];
     74 		}else{
     75 			if(symhdr){
     76 				fprint(2, "already have text %s; ignoring text %s\n", symfil, argv[i]);
     77 				uncrackhdr(hdr);
     78 				continue;
     79 			}
     80 			symhdr = hdr;
     81 			symfil = argv[i];
     82 		}
     83 	}
     84 
     85 	if(symhdr == nil){
     86 		symfil = "a.out";	/* default */
     87 		if(corpid){	/* try from corpid */
     88 			if((s = proctextfile(corpid)) != nil){
     89 				if(verbose)
     90 					fprint(2, "corpid %d: text %s\n", corpid, s);
     91 				symfil = s;
     92 			}
     93 		}
     94 		if(corhdr && corhdr->cmdline){	/* try from core */
     95 			/*
     96 			 * prog gives only the basename of the command,
     97 			 * so try the command line for a path.
     98 			 */
     99 			if((s = strdup(corhdr->cmdline)) != nil){
    100 				t = strchr(s, ' ');
    101 				if(t)
    102 					*t = 0;
    103 				if((t = searchpath(s)) != nil){
    104 					if(verbose)
    105 						fprint(2, "core: text %s\n", t);
    106 					symfil = t;
    107 				}
    108 				free(s);
    109 			}
    110 		}
    111 		if((symhdr = crackhdr(symfil, omode)) == nil){
    112 			fprint(2, "crackhdr %s: %r\n", symfil);
    113 			symfil = nil;
    114 		}
    115 	}
    116 
    117 	if(symhdr)
    118 		symopen(symhdr);
    119 
    120 	if(!mach)
    121 		mach = machcpu;
    122 
    123 	/*
    124 	 * Set up maps
    125 	 */
    126 	symmap = allocmap();
    127 	cormap = allocmap();
    128 	if(symmap == nil || cormap == nil)
    129 		sysfatal("allocating maps: %r");
    130 
    131 	if(symhdr){
    132 		if(mapfile(symhdr, 0, symmap, nil) < 0)
    133 			fprint(2, "mapfile %s: %r\n", symfil);
    134 		mapfile(symhdr, 0, cormap, nil);
    135 	}
    136 
    137 	if(corpid)
    138 		attachproc(corpid);
    139 	if(corhdr)
    140 		attachcore(corhdr);
    141 
    142 	attachdynamic(verbose);
    143 	return 0;
    144 }
    145 
    146 static int thecorpid;
    147 static Fhdr *thecorhdr;
    148 
    149 static void
    150 unattach(void)
    151 {
    152 	unmapproc(cormap);
    153 	unmapfile(corhdr, cormap);
    154 	free(correg);
    155 	correg = nil;
    156 	thecorpid = 0;
    157 	thecorhdr = nil;
    158 	corpid = 0;
    159 	corhdr = nil;
    160 	corfil = nil;
    161 }
    162 
    163 int
    164 attachproc(int pid)
    165 {
    166 	unattach();
    167 	if(pid == 0)
    168 		return 0;
    169 	if(mapproc(pid, cormap, &correg) < 0){
    170 		fprint(2, "attachproc %d: %r\n", pid);
    171 		return -1;
    172 	}
    173 	thecorpid = pid;
    174 	corpid = pid;
    175 	return 0;
    176 }
    177 
    178 int
    179 attachcore(Fhdr *hdr)
    180 {
    181 	unattach();
    182 	if(hdr == nil)
    183 		return 0;
    184 	if(mapfile(hdr, 0, cormap, &correg) < 0){
    185 		fprint(2, "attachcore %s: %r\n", hdr->filename);
    186 		return -1;
    187 	}
    188 	thecorhdr = hdr;
    189 	corhdr = hdr;
    190 	corfil = hdr->filename;
    191 	return 0;
    192 }
    193 
    194 int
    195 attachdynamic(int verbose)
    196 {
    197 	extern void elfdl386mapdl(int);
    198 
    199 	if(mach && mach->type == M386 && symhdr && symhdr->elf)
    200 		elfdl386mapdl(verbose);
    201 	return 0;
    202 }