]> git.pld-linux.org Git - projects/setup.git/blob - update-fstab.c
9a85d2f3d5b57070cebaccf6a368225d268d8239
[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         if (old == NULL) {
40                 eputs("\nError: malloc failure\n");
41                 return 1;
42         }
43         read(fd, old, st.st_size);
44         close(fd);
45         old_sz = st.st_size;
46         
47         fd = open(backup_name, O_WRONLY|O_CREAT|O_TRUNC, 0600);
48         if (fd < 0) {
49                 eputs("\nError: can't make backup\n");
50                 return 2;
51         }
52         write(fd, old, old_sz);
53         close(fd);
54         
55         // find usbfs
56         for (i = 0; i < old_sz; i++) {
57                 if ( old[i] == 'u' && old[i+1] == 's' && old[i+2] == 'b'
58                                 && old[i+3] == 'f' && old[i+4] == 's')
59                         break;
60         }
61         // find defau(lts)
62         for (;i < old_sz; i++) {
63                 if ( old[i] == 'd' && old[i+1] == 'e' && old[i+2] == 'f' && old[i+3] == 'a' && old[i+4] == 'u' )
64                         break;
65         }
66         // find first space
67         for (;i < old_sz; i++) {
68                 if ( old[i] == ' ' || old[i] == '\t' )
69                         break;
70         }
71         if ( i >= old_sz ) {
72                 eputs("\nError: can't find correct usbfs entry\n");
73                 return 3;
74         }
75         
76         fd = open(name, O_WRONLY|O_CREAT|O_TRUNC);
77         if (fd < 0) {
78                 eputs("\nError: can't open file for writing\n");
79                 return 4;
80         }
81         write(fd, old, i);
82         write(fd, add, strlen(add));
83         write(fd, old + i, old_sz - i);
84         close(fd);
85         eputs("OK\n");
86         
87         return 0;
88 }
89
This page took 0.051953 seconds and 2 git commands to generate.