Subversion Repositories wimsdev

Rev

Rev 6790 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  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.  
  94.