Skip to content
Advertisement

system call open() creating executable

if(cmds.at(i)==">")
{
            //convert strings to char*s
            char* conversion = new char[cmds.at(i-1).size()+1];
            copy(cmds.at(i-1).begin(),cmds.at(i-1).end(),conversion);
            conversion[cmds.at(i-1).size()] = '';
            const char * out_file_cstring = cmds.at(i+1).c_str();

            //count and agregate arguments
            int size = count_arguments(conversion);
            size++;
            char** args= new char*[size];//dont forget to delete
            args[0] = strtok(conversion," n");
            for(int j = 1; j<size; j++){args[j] = strtok(NULL, " n");}
            args[size-1]= NULL;

            //forking and redirection
            int out_file = open(out_file_cstring,O_CREAT|O_WRONLY|O_TRUNC);
            pid_t pid = fork();
            if(!pid)
            {
                dup2(out_file,STDOUT_FILENO);
                close(out_file);
                int r = execvp(args[0],args);
                if(r<0)
                {
                        cerr<<"ERROR : exec failed"<<args[0]<<endl;
                        return false;
                }
}

So my code creates and writes to the out_file properly. However, the file is an executable for some reason. I think the fault is in my open() call but I can’t seem to find why.

Advertisement

Answer

man 2 open explains why:

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

O_CREAT:
If  the  file  does not exist it will be created. [...] 
The permissions of the created file are (mode & ~umask).

So if you want a file that’s not executable, you can use:

open(out_file_cstring,O_CREAT|O_WRONLY|O_TRUNC, 0666);

0666 will suggest read/write for all (equivalent to the constant flags S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH), and the user’s umask will further limit the final permissions to the user’s chosen default.

User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement