#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; }