Advertisement
arsovski

Untitled

Aug 22nd, 2020
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 KB | None | 0 0
  1. #include<stdlib.h>
  2. #include<err.h>
  3. #include<errno.h>
  4. #include<stdint.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <fcntl.h>
  8. #include<unistd.h>
  9.  
  10. uint32_t power ( uint32_t num , uint32_t expo){
  11. for(uint32_t i=0;i<expo;i++){
  12. num*=num;
  13. }
  14.  
  15. return num;
  16. }
  17.  
  18. int main(int argc, char* argv[])
  19. {
  20. if( argc != 2 ) {
  21. errx(1,"Invalid arguments");
  22. }
  23.  
  24. struct reader {
  25. uint32_t id;
  26. uint16_t reserved1;
  27. uint16_t reserved2;
  28. uint32_t start;
  29. uint32_t end;
  30. };
  31.  
  32. struct reader rd;
  33.  
  34. struct stat st;
  35.  
  36. if( stat(argv[1],&st) == -1 ) {
  37. err(2,"Failed to stat file");
  38. }
  39.  
  40.  
  41. if( st.st_size == 0 ) {
  42. errx(3,"Empty file");
  43. }
  44.  
  45. if( (st.st_size % sizeof(rd)) != 0 ) {
  46. errx(4,"Invalid file size");
  47. }
  48.  
  49. int fd= open(argv[1],O_RDWR);
  50.  
  51. if( fd == -1 ) {
  52. err(-1,"Failed to open file");
  53. }
  54.  
  55. uint32_t num_members= st.st_size / sizeof(rd);
  56.  
  57. uint32_t sum_time=0;
  58. while( read(fd,&rd,sizeof(rd)) == sizeof(rd)) {
  59.  
  60. sum_time= sum_time + ( rd.end - rd.start);
  61. }
  62.  
  63. if( lseek(fd,0,SEEK_SET) == -1 ) {
  64. int old=errno;
  65. close(fd);
  66. errno=old;
  67. err(-2,"Failed to lseek file");
  68. }
  69.  
  70. uint32_t avg=sum_time / num_members;
  71. uint32_t disp=0;
  72.  
  73. while( read(fd,&rd,sizeof(rd)) == sizeof(rd)) {
  74. disp= disp + ( power((rd.end-rd.start)-avg,2));
  75. }
  76.  
  77. disp= disp / num_members;
  78.  
  79. if( lseek(fd,0,SEEK_SET) == -1 ) {
  80. int old=errno;
  81. close(fd);
  82. errno=old;
  83. err(-2,"Failed to lseek file");
  84. }
  85.  
  86.  
  87. while( read(fd,&rd,sizeof(rd)) == sizeof(rd)) {
  88. uint32_t result = power(rd.end-rd.start,2);
  89.  
  90. if( result > disp) {
  91. uint32_t id=rd.id;
  92. if( write(1,&id,sizeof(id)) != sizeof(id)) {
  93. int old=errno;
  94. close(fd);
  95. errno=old;
  96. err(-3,"Failed to write user id to STDOUT");
  97. }
  98. }
  99. }
  100.  
  101. close(fd);
  102.  
  103.  
  104. }
  105.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement