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