how to simulate "mkdir -p /home/blah1/blah2/blah3" in "c" where only /home exist


 
Thread Tools Search this Thread
Top Forums Programming how to simulate "mkdir -p /home/blah1/blah2/blah3" in "c" where only /home exist
# 1  
Old 10-03-2009
Question how to simulate "mkdir -p /home/blah1/blah2/blah3" in "c" where only /home exist

I'm trying to make use of mkdir(char *pathname, S_IRWXU) to create the directories.

but it only creates one directory at a time. so I have to separate the tokens for "/home/blah1/blah2/blah3" as "home blah1 blah2 blah3" using delimiter "/", but it is again hectic to create such directory structure.

I know Linux command "mkdir -p /home/blah1/blah2/blah3" would create all the sub-directories if it doesn't exist.

how to achieve the same "mkdir -p /home/blah1/blah2/blah3" in "c" where only /home exist

I'm using Redhat Linux 9 on Intel board 915GLVG
# 2  
Old 10-03-2009
Here's the code for how it's done in Solaris, as you can see you do have to tokenize and create the structure.
# 3  
Old 10-04-2009
Quote:
Originally Posted by reborg
Here's the code for how it's done in Solaris, as you can see ...
I see nothing Smilie
Quote:
Originally Posted by platinumedge
how to achieve the same "mkdir -p /home/blah1/blah2/blah3" in "c" where only /home exist
The easiest way (ok hardly pure C):
Code:
system("mkdir -p /home/blah1/blah2/blah3");

# 4  
Old 10-04-2009
Quote:
Originally Posted by jlliagre
I see nothing Smilie

Good point I forgot the code:

c code:
  1. if (mkdir(arg, mode) < 0)
  2.                 {
  3.                         if (!pflag || !(errno == ENOENT || errno == EEXIST || errno == ENOTDIR))
  4.                         {
  5.                                 error(ERROR_system(0), "%s:", arg);
  6.                                 continue;
  7.                         }
  8.                         if (errno == EEXIST)
  9.                                 continue;
  10.  
  11.                         /*
  12.                          * -p option, preserve intermediates
  13.                          * first eliminate trailing /'s
  14.                          */
  15.  
  16.                         n = strlen(arg);
  17.                         while (n > 0 && arg&#91;--n] == '/');
  18.                         arg&#91;n + 1] = 0;
  19.                         for (name = arg, n = *arg; n;)
  20.                         {
  21.                                 /* skip over slashes */
  22.                                 while (*arg == '/')
  23.                                         arg++;
  24.                                 /* skip to next component */
  25.                                 while ((n = *arg) && n != '/')
  26.                                         arg++;
  27.                                 *arg = 0;
  28.                                 if (mkdir(name, n ? dmode : mode) < 0 && errno != EEXIST && access(name, F_OK) < 0)
  29.                                 {
  30.                                         *arg = n;
  31.                                         error(ERROR_system(0), "%s:", name);
  32.                                         break;
  33.                                 }
  34.                                 if (!(*arg = n) && (mode & (S_ISVTX|S_ISUID|S_ISGID)))
  35.                                 {
  36.                                         if (stat(name, &st))
  37.                                         {
  38.                                                 error(ERROR_system(0), "%s: cannot stat", name);
  39.                                                 break;
  40.                                         }
  41.                                         if ((st.st_mode & (S_ISVTX|S_ISUID|S_ISGID)) != (mode & (S_ISVTX|S_ISUID|S_ISGID)) && chmod(name, mode))
  42.                                         {
  43.                                                 error(ERROR_system(0), "%s: cannot change mode from %s to %s", name, fmtperm(st.st_mode & (S_ISVTX|S_ISUID|S_ISGID)), fmtperm(mode));
  44.                                                 break;
  45.                                         }
  46.                                 }
  47.                         }
  48.                 }
# 5  
Old 10-06-2009
Quote:
Originally Posted by platinumedge
I'm trying to make use of mkdir(char *pathname, S_IRWXU) to create the directories.

but it only creates one directory at a time. so I have to separate the tokens for "/home/blah1/blah2/blah3" as "home blah1 blah2 blah3" using delimiter "/", but it is again hectic to create such directory structure.

I know Linux command "mkdir -p /home/blah1/blah2/blah3" would create all the sub-directories if it doesn't exist.

how to achieve the same "mkdir -p /home/blah1/blah2/blah3" in "c" where only /home exist

I'm using Redhat Linux 9 on Intel board 915GLVG
The best way is probably to iterate and call mkdir and chdir every time.
I'm actually in the process of doing something similar, and that's the way I'll go.
Constructing the (full) path every time is quite annoying, while changing the working
directory should be more easy.

S.
# 6  
Old 10-06-2009
Quote:
Originally Posted by emitrax
Constructing the (full) path every time is quite annoying, while changing the working directory should be more easy.
Why not just append to the string instead of recreating every time?
# 7  
Old 10-06-2009
Quote:
Originally Posted by emitrax
The best way is probably to iterate and call mkdir and chdir every time.
I'm actually in the process of doing something similar, and that's the way I'll go.
Constructing the (full) path every time is quite annoying, while changing the working
directory should be more easy.

S.
That solution introduces an effect that impacts the entire process it's running in: the changing of the current directory.

If you do something like that you will then have what's almost certainly an undocumented and definitely an unnecessary dependency on the internal implementation of what should in theory be reusable code. Unless you fully document all the internals of such calls, then you'll only have an unnecessary dependency.

And you'll outright break multithreaded apps because threads other than the one calling a mkdir() call that changes the current directory will have the current directory modified right out from under their processing.
Login or Register to Ask a Question

Previous Thread | Next Thread

6 More Discussions You Might Find Interesting

1. AIX

Apache 2.4 directory cannot display "Last modified" "Size" "Description"

Hi 2 all, i have had AIX 7.2 :/# /usr/IBMAHS/bin/apachectl -v Server version: Apache/2.4.12 (Unix) Server built: May 25 2015 04:58:27 :/#:/# /usr/IBMAHS/bin/apachectl -M Loaded Modules: core_module (static) so_module (static) http_module (static) mpm_worker_module (static) ... (3 Replies)
Discussion started by: penchev
3 Replies

2. Shell Programming and Scripting

Bash script - Print an ascii file using specific font "Latin Modern Mono 12" "regular" "9"

Hello. System : opensuse leap 42.3 I have a bash script that build a text file. I would like the last command doing : print_cmd -o page-left=43 -o page-right=22 -o page-top=28 -o page-bottom=43 -o font=LatinModernMono12:regular:9 some_file.txt where : print_cmd ::= some printing... (1 Reply)
Discussion started by: jcdole
1 Replies

3. UNIX for Dummies Questions & Answers

Using "mailx" command to read "to" and "cc" email addreses from input file

How to use "mailx" command to do e-mail reading the input file containing email address, where column 1 has name and column 2 containing “To” e-mail address and column 3 contains “cc” e-mail address to include with same email. Sample input file, email.txt Below is an sample code where... (2 Replies)
Discussion started by: asjaiswal
2 Replies

4. Solaris

Descrepencies in o/p of "df -h" and "df -h /home"

Hello, In my system, there are descrepencies in the output of "df -h" and "df -h /home" when i give df -h , it does not show any entry for /home, wheras for df -h /home it gives the below o/p Filesystem size used avail capacity Mounted on auto_home ... (1 Reply)
Discussion started by: Laxxi
1 Replies

5. Shell Programming and Scripting

awk command to replace ";" with "|" and ""|" at diferent places in line of file

Hi, I have line in input file as below: 3G_CENTRAL;INDONESIA_(M)_TELKOMSEL;SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL My expected output for line in the file must be : "1-Radon1-cMOC_deg"|"LDIndex"|"3G_CENTRAL|INDONESIA_(M)_TELKOMSEL"|LAST|"SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL" Can someone... (7 Replies)
Discussion started by: shis100
7 Replies

6. UNIX for Dummies Questions & Answers

Explain the line "mn_code=`env|grep "..mn"|awk -F"=" '{print $2}'`"

Hi Friends, Can any of you explain me about the below line of code? mn_code=`env|grep "..mn"|awk -F"=" '{print $2}'` Im not able to understand, what exactly it is doing :confused: Any help would be useful for me. Lokesha (4 Replies)
Discussion started by: Lokesha
4 Replies
Login or Register to Ask a Question