Subversion Repositories wimsdev

Rev

Rev 6790 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
10 reyssat 1
/*    Copyright (C) 1998-2003 XIAO, Gang of Universite de Nice - Sophia Antipolis
2
 *
3
 *  This program is free software; you can redistribute it and/or modify
4
 *  it under the terms of the GNU General Public License as published by
5
 *  the Free Software Foundation; either version 2 of the License, or
6
 *  (at your option) any later version.
7
 *
8
 *  This program is distributed in the hope that it will be useful,
9
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
 *  GNU General Public License for more details.
12
 *
13
 *  You should have received a copy of the GNU General Public License
14
 *  along with this program; if not, write to the Free Software
15
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
16
 */
17
 
18
/* File manipulation */
19
 
20
enum{is_file, is_dir, is_exec, is_fifo, is_socket, is_unknown};
21
struct stat ftst;
22
 
23
        /* A simple front-end of stat(). */
24
int ftest(char *fname)
25
{
26
    if(strstr(fname,"..")!=NULL) return -1; /* parent directory not allowed */
27
    if(stat(fname,&ftst)) return -1;
28
    if(S_ISREG(ftst.st_mode)) {
29
        if((ftst.st_mode&(S_IXUSR|S_IXGRP|S_IXOTH))!=0) return is_exec;
30
        else return is_file;
31
    }
32
    if(S_ISDIR(ftst.st_mode)) return is_dir;
33
    if(S_ISFIFO(ftst.st_mode)) return is_fifo;
34
    if(S_ISSOCK(ftst.st_mode)) return is_socket;
35
    return is_unknown;
36
}
37
 
38
        /* read the content of a file */
39
void readfile(char *fname, char buf[], long int buflen)
40
{
41
    int fd, t, st;
42
    long int l, lc;
43
    t=0; buf[0]=0;
44
    st=ftest(fname); if(st!=is_file) return;
45
    l=ftst.st_size; if(l<=0) return;
46
    if(l>=buflen) l=buflen-1;   /* silent trancation */
47
    fd=open(fname,O_RDONLY); if(fd==-1) return;
48
    lc=read(fd,buf,l); close(fd);
49
    if(lc!=l) {buf[0]=0; return;}
50
    buf[lc]=0; _tolinux(buf); return;
51
}
52
 
53
        /* datafile structure: number of records.
54
         * tag=1 if direct access */
55
unsigned int datafile_recordnum(char *p)
56
{
57
    char *pp, buf[MAX_FILELEN+1];
58
    int i;
59
 
60
    readfile(p,buf,sizeof(buf));
61
    if(buf[0]!=tag_string[1]) i=0; else i=1;
62
    for(pp=strstr(buf,tag_string); pp!=NULL; i++, pp=strstr(pp+1,tag_string));
63
    return i;
64
}
65
 
66
        /* datafile structure: find record n, starting from 1 */
67
char *datafile_fnd_record(char *p, int n, char bf[])
68
{
69
    char *pp, *p2, buf[MAX_FILELEN+1];
70
    int i;
71
 
72
    bf[0]=0;
73
    if(n<0) return bf;
74
    readfile(p,buf,sizeof(buf));
75
    if(buf[0]!=tag_string[1]) i=0; else i=1;
76
    if(i<n) {
77
        for(i++, pp=strstr(buf,tag_string);
78
            i<n && pp!=NULL;
79
            i++, pp=strstr(pp+1,tag_string));
80
    }
81
    else {
82
        if(i>n) goto end;
83
        pp=buf-1;
84
    }
85
    if(pp==NULL) { /* n too big */
86
        goto end;
87
    }
88
    if(n>0) pp+=strlen(tag_string); else pp=buf;
89
    p2=strstr(pp,tag_string); if(p2) *p2=0;
90
    mystrncpy(bf,pp,MAX_LINELEN);
91
    end: return bf;
92
}
93