aboutsummaryrefslogtreecommitdiffstats
path: root/dvb.c
blob: cf60bf8628e6d072f645c8bb380bf8ac2e811dd4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* $Id: dvb.c,v 1.7 2003/11/11 04:30:41 reinelt Exp $
 *
 * DVB specific functions
 *
 * Copyright 2003 Michael Reinelt <reinelt@eunet.at>
 *
 * This file is part of LCD4Linux.
 *
 * LCD4Linux is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * LCD4Linux is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *
 * $Log: dvb.c,v $
 * Revision 1.7  2003/11/11 04:30:41  reinelt
 * very minor changes
 *
 * Revision 1.6  2003/10/05 17:58:50  reinelt
 * libtool junk; copyright messages cleaned up
 *
 * Revision 1.5  2003/08/08 23:08:38  reinelt
 * CVS Id and Log missing from dvb.{c,h}
 *
 */

/* 
 * exported functions:
 *
 * DVB (int *strength, int *snr)
 *   returns 0 if ok, -1 if error
 *   sets *strength to the signal strength
 *   sets *snr to the signal/noise ratio
 *
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <time.h>
#include <sys/ioctl.h>
#include <sys/types.h>

#include "config.h"
#include "debug.h"

#ifndef HAVE_LINUX_DVB_FRONTEND_H

#warning linux/dvb/frontend.h not found.
#warning DVB client will be disabled.

int DVB (double *strength, double *snr)
{
  static int flag=0;

  if (flag==0) {
    error("lcd4linux has been compiled without DVB support");
    error("DVB client will be disabled");
    flag=1;
  }

  *strength=0.0;
  *snr=0.0;

  return 0;
}

#else

#include <linux/dvb/frontend.h>
#include "dvb.h"

int DVB (double *strength, double *snr)
{
  static time_t now=0;
  static int fd=-2;
  static double strength0=0.0;
  static double snr0=0.0;
  
  unsigned short raw_strength;
  unsigned short raw_snr;

  *strength=strength0;
  *snr=snr0;

  if (fd==-1) return -1;
  
  if (time(NULL)==now) return 0;
  time(&now);

  if (fd==-2) {
    fd = open("/dev/dvb/adapter0/frontend0", O_RDONLY);
    if (fd==-1) {
      error ("open(/dev/dvb/adapter0/frontend0) failed: %s", strerror(errno));
      return -1;
    }
    debug ("open (/dev/dvb/adapter0/frontend0)=%d", fd);
  }

  if (ioctl(fd, FE_READ_SIGNAL_STRENGTH, &raw_strength)!=0) {
    error("ioctl(FE_READ_SIGNAL_STRENGTH) failed: %s", strerror(errno));
    fd=-1;
    return -1;
  }
  
  if (ioctl(fd, FE_READ_SNR, &raw_snr)!=0) {
    error("ioctl(FE_READ_SNR) failed: %s", strerror(errno));
    fd=-1;
    return -1;
  }
  
  // Normalize to 1.0
  strength0=raw_strength/65535.0;
  snr0=raw_snr/65535.0;
  
  *strength=strength0;
  *snr=snr0;

  return 0;
}

#endif
pan class="cm"> * * cfg_file (void) * returns the file the configuration was read from * */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <unistd.h> #include <sys/stat.h> #include "debug.h" #include "cfg.h" typedef struct { char *key; char *val; int lock; } ENTRY; static char *Config_File=NULL; static ENTRY *Config=NULL; static int nConfig=0; static char *strip (char *s, int strip_comments) { char *p; while (isblank(*s)) s++; for (p=s; *p; p++) { if (*p=='"') do p++; while (*p && *p!='\n' && *p!='"'); if (*p=='\'') do p++; while (*p && *p!='\n' && *p!='\''); if (*p=='\n' || (strip_comments && *p=='#' && (p==s || *(p-1)!='\\'))) { *p='\0'; break; } } for (p--; p>s && isblank(*p); p--) *p='\0'; return s; } static char *dequote (char *string) { char *s=string; char *p=string; do { if (*s=='\\' && *(s+1)=='#') { *p++=*++s; } else { *p++=*s; } } while (*s++); return string; } static void cfg_add (char *key, char *val, int lock) { int i; for (i=0; i<nConfig; i++) { if (strcasecmp(Config[i].key, key)==0) { if (Config[i].lock>lock) return; if (Config[i].val) free (Config[i].val); Config[i].val=dequote(strdup(val)); return; } } nConfig++; Config=realloc(Config, nConfig*sizeof(ENTRY)); Config[i].key=strdup(key); Config[i].val=dequote(strdup(val)); Config[i].lock=lock; } int cfg_cmd (char *arg) { char *key, *val; char buffer[256]; strncpy (buffer, arg, sizeof(buffer)); key=strip(buffer, 0); for (val=key; *val; val++) { if (*val=='=') { *val++='\0'; break; } } if (*key=='\0' || *val=='\0') return -1; cfg_add (key, val, 1); return 0; } void cfg_set (char *key, char *val) { cfg_add (key, val, 0); } char *cfg_get (char *key) { int i; for (i=0; i<nConfig; i++) { if (strcasecmp(Config[i].key, key)==0) { return Config[i].val; } } return NULL; } static int check_cfg_file(char *file) { /* as passwords and commands are stored in the config file, * we will check that: * - file is a normal file (or /dev/null) * - file owner is owner of program * - file is not accessible by group * - file is not accessible by other */ struct stat stbuf; uid_t uid, gid; int error; uid = geteuid(); gid = getegid(); if (stat(file, &stbuf) == -1) { error ("stat(%s) failed: %s", file, strerror(errno)); return -1; } if (S_ISCHR(stbuf.st_mode) && strcmp(file, "/dev/null") == 0) return 0; error=0; if (!S_ISREG(stbuf.st_mode)) { error ("security error: '%s' is not a regular file", file); error=-1; } if (stbuf.st_uid != uid || stbuf.st_gid != gid) { error ("security error: owner and/or group of '%s' don't match", file); error=-1; } if (stbuf.st_mode & S_IRWXG || stbuf.st_mode & S_IRWXO) { error ("security error: group or other have access to '%s'", file); error=-1; } return error; } int cfg_read (char *file) { FILE *stream; char buffer[256]; char *line, *p, *s; if (check_cfg_file(file) == -1) { error("config file '%s' is insecure, aborting", file); exit(2); } stream=fopen (file, "r"); if (stream==NULL) { error ("open(%s) failed: %s", file, strerror(errno)); return-1; } if (Config_File) free (Config_File); Config_File=strdup(file); while ((line=fgets(buffer,256,stream))!=NULL) { if (*(line=strip(line, 1))=='\0') continue; for (p=line; *p; p++) { if (isblank(*p)) { *p++='\0'; break; } } p=strip(p, 1); if (*p) for (s=p; *(s+1); s++); else s=p; if (*p=='"' && *s=='"') { *s='\0'; p++; } else if (*p=='\'' && *s=='\'') { *s='\0'; p++; } cfg_set (line, p); } fclose (stream); return 0; } char *cfg_file (void) { if (Config_File) return Config_File; else return ""; }