.TH GET9ROOT 3 .SH NAME get9root, unsharp \- get path to root of Plan 9 tree .SH SYNOPSIS .B #include .br .B #include .PP .B char* get9root(void) .PP .B char* unsharp(char *path) .SH DESCRIPTION This tree of Plan 9 software is conventionally installed in .B \*9 but may be installed in other places (for example, users without the ability to write to .B /usr/local may with to install it in their own home directories). The environment variable .B $PLAN9 should contain the path to the root. .I Get9root returns a static pointer to the pathname of root, first checking .B $PLAN9 and defaulting to .BR \*9 . .PP The lack of a fixed location for the Plan 9 tree makes it difficult to hard-code paths to files. .I Unsharp replaces a leading .B #9 in .I path with the root of the tree. .I Unsharp also replaces a leading .B #d with the path to the underlying system's file descriptor dup device, typically .BR /dev/fd . The string returned from .IR unsharp , if different from .IR path , should be freed with .I free (see .MR malloc 3 ) when no longer needed. .PP As a convention, programs should never .I unsharp paths obtained from user input. .SH EXAMPLE The .MR plumber 4 uses this code to find unrooted file names included by plumb rules. .IP .EX snprint(buf, sizeof buf, "#9/plumb/%s", name); fd = open(unsharp(buf), OREAD); .EE .SH SOURCE .B \*9/src/lib9/get9root.c .br .B \*9/src/lib9/unsharp.c .SH SEE ALSO .MR intro 4 .SH BUGS .I Get9root could be smarter about finding the tree when .B $PLAN9 is not set.