2017年3月1日 星期三

[C] file status in C

  void process(int fd, struct sockaddr_in *clientaddr){                                                                                                 
      printf("accept request, fd is %d, pid is %d\n", fd, getpid());                                                                                    
      http_request req;                                                                                                                                 
      parse_request(fd, &req);                                                                                                                          

      struct stat sbuf;                                                                                                                                 
      int status = 200, ffd = open(req.filename, O_RDONLY, 0);                                                                                          
      if(ffd <= 0){                                                                                                                                     
          status = 404;                                                                                                                                 
          char *msg = "File not found";                                                                                                                 
          client_error(fd, status, "Not found", msg);                                                                                                   
      } else {                                                                                                                                          
          fstat(ffd, &sbuf);                                                                                                                            
          if(S_ISREG(sbuf.st_mode)){                                                                                                                    
              if (req.end == 0){                                                                                                                        
                  req.end = sbuf.st_size;                                                                                                               
              }                                                                                                                                         
              if (req.offset > 0){                                                                                                                      
                  status = 206;                                                                                                                         
              }                                                                                                                                         
              serve_static(fd, ffd, &req, sbuf.st_size);                                                                                                
          } else if(S_ISDIR(sbuf.st_mode)){                                                                                                             
              status = 200;                                                                                                                             
              handle_directory_request(fd, ffd, req.filename);                                                                                          
          } else {                                                                                                                                      
              status = 400;                                                                                                                             
              char *msg = "Unknow Error";                                                                                                               
              client_error(fd, status, "Error", msg);                                                                                                   
          }                                                                                                                                             
          close(ffd);                                                                                                                                   
      }                                                                                                                                                 
      log_access(status, clientaddr, &req);                                                                                                             
  } 
       S_ISREG(m)  is it a regular file?

       S_ISDIR(m)  directory?

       S_ISCHR(m)  character device?

       S_ISBLK(m)  block device?

       S_ISFIFO(m) FIFO (named pipe)?

       S_ISLNK(m)  symbolic link?  (Not in POSIX.1-1996.)

       S_ISSOCK(m) socket?  (Not in POSIX.1-1996.)

Reference:

0 意見:

張貼留言