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.