]> git.pld-linux.org Git - projects/setup.git/blob - update-fstab.c
add etc/sub[ug]id
[projects/setup.git] / update-fstab.c
1 /*
2  * adds devmode and devgid to usbfs in fstab
3  *
4  */
5 #include <sys/types.h>
6 #include <sys/mman.h>
7 #include <sys/stat.h>
8 #include <unistd.h>
9 #include <fcntl.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <signal.h>
13
14 void eputs(const char *msg)
15 {
16         write(2, msg, strlen(msg));
17 }
18
19 int main()
20 {
21         char *name = "/etc/fstab";
22         char *backup_name = "/etc/fstab.bak";
23         char *add = ",devgid=78,devmode=0664";
24         
25         char *old;
26         int fd;
27         ssize_t i, old_sz;
28         struct stat st;
29
30         eputs("Updating /etc/fstab...");
31         fd = open(name, O_RDONLY);
32         if (fd < 0) {
33                 eputs("\nError: can't open file\n");
34                 return 1;
35         }
36         fstat(fd, &st);
37         old = (char *) malloc(st.st_size);
38         if (old == NULL) {
39                 eputs("\nError: malloc failure\n");
40                 return 1;
41         }
42         read(fd, old, st.st_size);
43         close(fd);
44         old_sz = st.st_size;
45         
46         fd = open(backup_name, O_WRONLY|O_CREAT|O_TRUNC, 0600);
47         if (fd < 0) {
48                 eputs("\nError: can't make backup\n");
49                 return 2;
50         }
51         write(fd, old, old_sz);
52         close(fd);
53         
54         // find usbfs
55         for (i = 0; i < old_sz; i++) {
56                 if ( old[i] == 'u' && old[i+1] == 's' && old[i+2] == 'b'
57                                 && old[i+3] == 'f' && old[i+4] == 's')
58                         break;
59         }
60         // find defau(lts)
61         for (;i < old_sz; i++) {
62                 if ( old[i] == 'd' && old[i+1] == 'e' && old[i+2] == 'f' && old[i+3] == 'a' && old[i+4] == 'u' )
63                         break;
64         }
65         // find first space
66         for (;i < old_sz; i++) {
67                 if ( old[i] == ' ' || old[i] == '\t' )
68                         break;
69         }
70         if ( i >= old_sz ) {
71                 eputs("\nError: can't find correct usbfs entry\n");
72                 return 0;
73         }
74         
75         fd = open(name, O_WRONLY|O_CREAT|O_TRUNC, 0644);
76         if (fd < 0) {
77                 eputs("\nError: can't open file for writing\n");
78                 return 4;
79         }
80         write(fd, old, i);
81         write(fd, add, strlen(add));
82         write(fd, old + i, old_sz - i);
83         close(fd);
84         eputs("OK\n");
85         
86         return 0;
87 }
88
This page took 0.04904 seconds and 3 git commands to generate.