csystemasprintf

Empty file when using sprintf and system function on C


I want to save some information in a file text, I wrote this program:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>


int main(int argc,char *argv[])
 {
     FILE *fichier;
     char buffer[20];
     char command[200];
     char command1[100];


     system(" cat /etc/resolv.conf  | grep nameserver | awk -F' ' '{print $2}' | cut -d'.' -f1-3 | awk '{print $1\".1\"}' > ethernet_dns.txt");

     fichier=fopen("ethernet_dns.txt","r");
     memset(&buffer,0,sizeof(buffer));
     fread(buffer,20,1,fichier);
     printf("buffer is: %s",buffer);

     snprintf(command,sizeof(command),"ping -c 1 -W 1  %s > /tmp/ping_result",buffer);
      printf("command is: %s",command);

     system(command);


     return 0;
 }

Results:

buffer is: 127.0.1.1
command is : ping -c 1 -W 1 127.0.1.1

the system command returns this:

    PING 127.0.1.1 (127.0.1.1) 56(84) bytes of data.
64 bytes from 127.0.1.1: icmp_seq=1 ttl=64 time=0.115 ms

--- 127.0.1.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.115/0.115/0.115/0.000 ms

But when I run : cat /tmp/ping_result.I got an empty file


Solution

  • the posted code has a couple of problems

    1) outputs results of ping to stdout rather than to /tmp/ping_result

    2) fails to removed trailing newline from the buffer[] array

    The following code

    1) cleans up the indenting

    2) corrects the problems in the code

    3) handles possible failure of call to fopen()

    4) eliminates unneeded final statement: return 0

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    int main( void )
    {
         FILE *fichier;
         char buffer[20];
         char command[200];
    
    
    
         system(" cat /etc/resolv.conf  | grep nameserver | awk -F' ' '{print $2}' | cut -d'.' -f1-3 | awk '{print $1\".1\"}' > ethernet_dns.txt");
    
         fichier=fopen("ethernet_dns.txt","r");
         if( !fichier )
         {
             perror( "fopen for ethernet_dns.txt failed");
             exit( EXIT_FAILURE );
         }
    
         // implied else, fopen successful
    
         memset(buffer,0,sizeof(buffer));
         size_t len = fread(buffer,1, sizeof(buffer),fichier);
         printf( "len is: %lu\n", len );
         buffer[len-1] = '\0'; // eliminates trailing newline
         printf("buffer is: %s\n",buffer);
    
         snprintf(command,sizeof(command),"ping -c 1 -W 1 ");
         strcat( command, buffer);
         strcat( command, " > /tmp/ping_result");
         printf("command is: %s\n",command);
    
         system(command);
    }
    

    the resulting output, on my computer, is in file: /tmp/ping_result

    PING 127.0.1.1 (127.0.1.1) 56(84) bytes of data.
    64 bytes from 127.0.1.1: icmp_seq=1 ttl=64 time=0.046 ms
    
    --- 127.0.1.1 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.046/0.046/0.046/0.000 ms