Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.99 KB | None | 0 0
  1. /*
  2. 1. Implementati comanda 'chgrp GROUP FILE...'
  3. (modifica grupul fisierelor specificate de 'FILE...' in 'GROUP', dat
  4. ca nume).
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <unistd.h>
  10. #include <errno.h>
  11. #include <sys/types.h>
  12. #include <sys/stat.h>
  13. #include <grp.h>
  14.  
  15. gid_t newgid;
  16. int filec;
  17. char** files;
  18.  
  19. gid_t parsegid(char* gids) {
  20. char* tail;
  21.  
  22. errno = 0;
  23. gid_t gid = strtol(gids, &tail, 0);
  24. if (errno || *tail != '\0') {
  25. return -1;
  26. }
  27.  
  28. return gid;
  29. }
  30.  
  31. gid_t gnametoid(char* gname) {
  32. struct group* grp;
  33.  
  34. gid_t gid;
  35. if ((gid = parsegid(gname)) != -1) {
  36. if ((grp = getgrgid(gid)) == NULL) {
  37. return -1;
  38. }
  39. }
  40. else {
  41. if ((grp = getgrnam(gname)) == NULL) {
  42. return -1;
  43. }
  44. }
  45.  
  46. return grp->gr_gid;
  47. }
  48.  
  49. void argparse(int argc, char** argv) {
  50. if (argc < 3) {
  51. fprintf(stderr, "Not enough arguments\nUSAGE: chgrp GROUP FILE...\n");
  52. exit(EXIT_FAILURE);
  53. }
  54.  
  55. errno = 0;
  56. char* gname = argv[1];
  57. if ((newgid = gnametoid(gname)) == -1) {
  58. // on some implementations, errno is not set when the given group is not found
  59. if (errno) {
  60. perror(gname);
  61. }
  62. else {
  63. fprintf(stderr, "invalid group: %s\n", gname);
  64. }
  65. exit(EXIT_FAILURE);
  66. }
  67.  
  68. filec = argc - 2;
  69. files = argv + 2;
  70. }
  71.  
  72. uid_t get_uid(const char* filename) {
  73. struct stat info;
  74.  
  75. if (stat(filename, &info)) {
  76. return -1;
  77. }
  78.  
  79. return info.st_uid;
  80. }
  81.  
  82. int chgrp(char * filename, gid_t newgid) {
  83. uid_t curruid;
  84. if ((curruid = get_uid(filename)) == -1) {
  85. return -1;
  86. }
  87.  
  88. return chown(filename, curruid, newgid);
  89. }
  90.  
  91. void procfiles(void) {
  92. int i;
  93. char* fname;
  94. for (i = 0; i < filec; i++) {
  95. fname = files[i];
  96.  
  97. if (chgrp(fname, newgid) == -1) {
  98. perror(fname);
  99. continue;
  100. }
  101. }
  102. }
  103.  
  104. int main(int argc, char** argv) {
  105. argparse(argc, argv);
  106.  
  107. procfiles();
  108.  
  109. return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement