:: Re: [DNG] Systemd Shims
Top Page
Delete this message
Reply to this message
Author: marc
Date:  
To: Edward Bartolo
CC: dng
Subject: Re: [DNG] Systemd Shims
Hello

> Now, I should think, the buffer overruns should not be possible, but I
> am open to criticism. Buffer overruns are not something to be proud of
> and correction when taken appropriately is a blessing.
>
> Now, I will sleep as I am totally exhausted from coding all day long.


Well, you deserved a good rest - congratulations for making the
effort to learn something and contributing software. Doing something
almost always beats talking about it.

Here is some feedback from me - for tomorrow, use or don't use.

  * The main() function is special, returning negative values
    in it doesn't have the expected results - generally values
    between 0 and 255 are possible. Convention is 0 is success,
    1 some sort of alternative success and larger numbers a 
    failure. /usr/include/sysexits.h defines some common failure
    modes, though not that many applications use those codes. 


    Anyway - try for yourself: run a program which returns a negative
    value and then use "echo $?" after it completes to see what
    actually made it back


* In your deletion logic you use

        int deleteConnect(char* essid) //argv[2]
        {
                //char* s = 0;
                char command[1024];
                strcpy(command, "/bin/rm /etc/network/wifi/");
                strcat(command, essid);
                int q = exec(command, 0);
                //printf(s);
                return q;
        }


    So it turns out there is a system call which is used internally
    by rm to do the deletion. It is called unlink (man 2 unlink)


    Using it means you could do


        int deleteConnect(char* essid) //argv[2]
        {
                char command[SIZE];
                int result;
                result = snprintf(command, SIZE, "/etc/network/wifi/%s", essid)
                if(result >= SIZE){
                  return -1;
                }
                return unlink(command);
        }


Code size-wise it doesn't look that different, but instead of
creating a shell process which then launches a rm process which
then does the unlink, you can do the unlink yourself - which
is faster and has fewer external interactions. It also means
that by looking at the errno variable if unlink fails you can
generate your own error messages.

Using "strace -f " on the program when calling the two versions
of deleteConnect() will show more detail

Finally - C is fun, keep going. And all the best

marc