]> git.pld-linux.org Git - packages/setup.git/blame - setup-update-fstab.c
- trigger written in C, now it must be OK !
[packages/setup.git] / setup-update-fstab.c
CommitLineData
a94e2ea8 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
15void eputs(const char *msg)
16{
17 write(2, msg, strlen(msg));
18}
19
20int 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.038495 seconds and 4 git commands to generate.