text: #include <u.h>
  #include <libc.h>
  
  /*
   * I don't want too many of these,
   * but the ones we have are just too useful. 
   */
  static struct {
  	char *old;
  	char *new;
  } replace[] = {
  	"#9", nil,	/* must be first */
  	"#d", "/dev/fd",
  };
  
  char*
  unsharp(char *old)
  {
  	char *new;
  	int i, olen, nlen, len;
  
  	if(replace[0].new == nil)
  		replace[0].new = get9root();
  
  	for(i=0; i<nelem(replace); i++){
  		if(!replace[i].new)
  			continue;
  		olen = strlen(replace[i].old);
  		if(strncmp(old, replace[i].old, olen) != 0
  		|| (old[olen] != '\0' && old[olen] != '/'))
  			continue;
  		nlen = strlen(replace[i].new);
  		len = strlen(old)+nlen-olen;
  		new = malloc(len+1);
  		if(new == nil)
  			/* Most callers won't check the return value... */
  			sysfatal("out of memory translating %s to %s%s", old, replace[i].new, old+olen);
  		strcpy(new, replace[i].new);
  		strcpy(new+nlen, old+olen);
  		assert(strlen(new) == len);
  		return new;
  	}
  	return old;
  }
  