views:

215

answers:

3

When I write

mkdir("~/folder1" , 0777);

in linux, it failed to create a directory. If I replace the ~ with the expanded home directory, it works fine. What is the problem with using ~ ?

Thanks

+4  A: 

~ is usually expanded by the shell. Not using the shell means that you are responsible for expanding it instead.

Ignacio Vazquez-Abrams
+6  A: 

~ is a shell meta-character, not a kernel-provided 'shortcut'.

See the wordexp(3) man page if you want to support ~ easily. (It may do much more than you want.)

sarnold
+14  A: 

~ is known only to the shell and not to the mkdir system call.

But if you try:

system("mkdir ~/foo");

this works as the "mkdir ~/foo" is passed to a shell and shell expands ~ to $HOME

If you want to make use of the $HOME with mkdir, you can make use of the getenv function as:

char path[MAX];
char *home = getenv ("HOME");
if (home != NULL) {
        sprintf(path,"%s/new_dir",home);
        // now use path in mkdir
        mkdir(path,PERM);
}
codaddict
-1 for giving example code with a huge buffer overflow issue. You should edit this to use snprintf or check the length of `home` before calling `sprintf`.
R..