if(fd = -1)
That's an assignment and always yields a value not equal to zero, therefore the body of the if
is always entered.
Pregunta
Here is my code of trying to open a file-descriptor and write data to it.
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
void usage(char *prog_name,char *filename)
{
printf("Usage: %s <data to add to %s>\n", prog_name, filename);
exit(0);
}
void fatal(char *);
void *ec_malloc(unsigned int);
int main(int argc,char *argv[])
{
int fd;
char *buffer,*datafile;
buffer = (char*)ec_malloc(100);
datafile = (char*)ec_malloc(20);
strcpy(datafile,"/home/note");
if(argc<2)
usage(argv[0],datafile);
strcpy(buffer,argv[1]);
printf("[DEBUG] buffer@ %p: \'%s\'\n", buffer, buffer);
printf("[DEBUG] datafile @ %p: \'%s\'\n", datafile, datafile);
strncat(buffer,"\n",1);
fd = open(datafile,O_WRONLY|O_CREAT|O_APPEND,S_IRUSR|S_IWUSR);
if(fd = -1)
fatal("In main() while opening file\n");
printf("[DEBUG] file descriptor is %d\n", fd);
if(write(fd, buffer, strlen(buffer)) == -1)
fatal("in main() while writing buffer to file");
if(close(fd) == -1)
fatal("in main() while closing file");
printf("Note has been saved.\n");
free(buffer);
free(datafile);
}
void fatal(char *message){
char error_message[100];
strcpy(error_message,"[!!] Fatal Error ");
strncat(error_message,message,strlen(message));
perror(error_message);
exit(-1);
}
void *ec_malloc(unsigned int x){
void *ptr = malloc(x);
if(ptr == NULL)
fatal("in ec_malloc() on memory allocation");
return ptr;
}
Now If I don't give any CL argument, then the response is
Usage: ./simplenote <data to add to /tmp/note>
But if I give command line such as, ./simplenote "This is a test"
than no filedescriptor is returned. Here is the output of what I get,
[DEBUG] buffer@ 0x1edf010: 'this is a test note'
[DEBUG] datafile @ 0x1edf080: '/tmp/note'
[!!] Fatal Error In main() while opening file
: Success
So, What is the problem? Why can't it open the file?
Solución
if(fd = -1)
That's an assignment and always yields a value not equal to zero, therefore the body of the if
is always entered.
Otros consejos
if(fd = -1)
should be if(fd == -1)
if(fd = -1)
should be if(fd == -1)
, if you want to avoid this kind of error you can always do the "YODA trick" :
Write : if(-1 == fd)
instead if(fd == -1)
. It is the same but if you do the mistake if(-1 = fd)
it will throw a compilation error !