C system() function

Issue

I’m trying to create a file in linux and give it executable rights using system() function in a C program. Here is the code:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char *argv[], char *envp[]){
char s[100];
strcpy(s, "touch ");
strcpy(s, argv[1]);
strcpy(s, "; chmod a+x ");
strcpy(s, argv[1]);
system(s);
return 0;
}

But when I call compiled file with argument "abs" for example (consider I want "abs" as the name of the file to be created) it gives such output:

sh: 1: abs: not found

How can it be fixed? It’s important that I have to use C programming and system() function.

Solution

It seems that answer is not understandable for future readers, let me try to explain what is the difference between strcpy and strcat

  • strcpy() copies one string into another.
  • strcat() function concatenates string by appending source string to destination string.

In the original code, every time a "strcpy" function was called, a previous value in the buffer was overwritten.

char s[100];
strcpy(s, "touch "); // s = touch
strcpy(s, argv[1]); // s = abc (argv[1] value)
strcpy(s, "; chmod a+x "); // s = ; chmod a+x 
strcpy(s, argv[1]); // s = abc (argv[1] value)
system(s); // execute s = abc

And finally, since "s" is "abc" system() function tries to execute it, which is producing the following error:

sh: 1: abs: not found

In the modified version, instead of overwriting the previous value, the new value is appended to the buffer.

char s[100];
strcpy(s, "touch "); // s = touch
strcat(s, argv[1]); // s = touch abc
strcat(s, "; chmod a+x "); // s = touch abc; chmod a+x
strcat(s, argv[1]); // s = touch abc; chmod a+x abc
system(s); // execute s = touch abc; chmod a+x abc

Answered By – David

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published