全部博文(132)
分类: C/C++
2009-02-23 10:21:32
#include <>
#include <>
#include <>
#include <>
#include <>
#include <>
#include <>
#include <>
#include <>
#include <>
#include <>
#include <>
#include <>
#include <>
#include <>
#include ""
#include ""
#include ""
#include ""
#include "" /* cdrom.* and mixer.* from */
#include "" /* wmrack by oliver graf. */
char *MAILCOMMAND;
char *PPPCOMMAND;
char *NETDEVICE;
char *MAILDIR;
int UPMAX;
int DOWNMAX;
int IOMAX;
char *ProgName;
FILE *fp_rc;
FILE *fp_meminfo;
FILE *fp_stat;
FILE *fp_loadavg;
FILE *fp_ppp;
long cpustat[5],cpuidle[5],cpustatlast,cpuidlelast;
long iostat[5],iostatlast;
long memused, memtotal, swapused, swaptotal;
long upstat[5], upidle[5], upstatlast;
long dostat[5], doidle[5], dostatlast;
int roll=1, mail=0, mmail=0, wmnup[20], wmndo[20], wmnetmode=1;
/* functions */
void wmmmnn_routine(int, char **);
void update_stat_cpu( void );
void update_stat_io( void );
void update_stat_mem( void );
void update_stat_ppp( void );
void defaults( void );
void main(int argc, char *argv[]) {
ProgName = argv[0];
if (strlen(ProgName) >= 5)
ProgName += (strlen(ProgName) - 5);
defaults();
wmmmnn_routine(argc, argv);
}
void wmmmnn_routine(int argc, char **argv) {
CD *cd;
MIXER *mixer;
int st=0, trax=0, song=0, songt, songo;
char *device="/dev/cdrom";
int changevolume=0, xvol, mixwhich=1, curvol;
int curmixer[5]= { 0, 4, 3, 6, 8 };
int curmixvol[5]= {0, 0, 0, 0, 0 };
char *mdevice="/dev/mixer";
XEvent Event;
struct stat St;
unsigned long i;
int xpm_X=0, xpm_Y=0, qq=0, qqq=0, qqqq, mode=0;
char *nscommand, *pp, *tempp;
const char *tokenss = " \t\n";
nscommand=(char *)malloc(256);
fp_meminfo = fopen("/proc/meminfo", "r");
fp_stat = fopen("/proc/stat", "r");
fp_ppp = fopen("/proc/net/dev", "r");
openXwindow(argc, argv, wmmmnn_master_xpm, wmmmnn_mask_bits, wmmmnn_mask_width, wmmmnn_mask_height);
for(i=0;i<20;i++)
wmnup[i]=wmndo[i]=0;
xpm_X = 0;
setMaskXY(0, 0);
cd=cd_open(device,0);
cd_getStatus(cd,0,1);
mixer=mixer_open(mdevice);
while (1) {
waitpid(0, NULL, WNOHANG);
if(!mode) {
roll++;
if(roll==5)
roll=0;
update_stat_cpu();
update_stat_io();
update_stat_ppp();
if(mail) {
if(qqq++==20) {
if(mmail) {
mmail=0;
copyXPMArea(4,99,22,12,4,32);
}
else {
mmail=1;
copyXPMArea(28,99,22,12,4,32);
}
qqq=0;
}
}
if(qq++==150) {
if (!stat(MAILDIR, &St))
if (St.st_mtime >= St.st_atime)
mail=1;
if (St.st_size == 0)
{
mail=0;
copyXPMArea(28,99,22,12,4,32);
}
fflush(fp_meminfo);
fflush(fp_ppp);
update_stat_mem();
qq=0;
}
}
else if(mode) {
usleep(60000L);
trax=cd_list(cd,tracks);
st=cd_getStatus(cd,0,0);
song=cd_cur(cd,track);
if(cd_cur(cd,mode)==1) {
copyXPMArea(51,72,11,13,15,4);
copyXPMArea(68,4,11,13,4,4);
}
else if(cd_cur(cd,mode)==2) {
copyXPMArea(79,4,11,13,15,4);
copyXPMArea(68,4,11,13,4,4);
}
else if(cd_cur(cd,mode)==3) {
copyXPMArea(79,4,11,13,15,4);
copyXPMArea(51,85,11,13,4,4);
}
songt=(song+1)/10;
songo=(song+1)-(songt*10);
copyXPMArea(4*songt,112,4,8,8,33);
copyXPMArea(4*songo,112,4,8,14,33);
copyXPMArea(92,4,32,54,28,4);
curvol=(curmixvol[1])*0.32;
copyXPMArea(32, 59, curvol, 12, 28, 4);
curvol=(curmixvol[2])*0.32;
copyXPMArea(32, 59, curvol, 12, 28, 18);
curvol=(curmixvol[3])*0.32;
copyXPMArea(32, 59, curvol, 12, 28, 32);
curvol=(curmixvol[4])*0.32;
copyXPMArea(32, 59, curvol, 12, 28, 46);
}
RedrawWindowXY(xpm_X, xpm_Y);
while (XPending(display)) {
XNextEvent(display, &Event);
switch (Event.type) {
case Expose:
RedrawWindowXY(xpm_X, xpm_Y);
break;
case DestroyNotify:
XCloseDisplay(display);
exit(0);
break;
case ButtonPress:
if(mode==0) {
switch (Event.xbutton.button) {
case 1:
if(Event.xbutton.y>32&&Event.xbutton.y<48&&Event.xbutton.x<26)
if(fork()==0) {
execl( "/bin/sh", "sh", "-c", MAILCOMMAND, NULL );
exit(15);
}
if(Event.xbutton.y<32&&Event.xbutton.x<26)
if(fork()==0) {
execl( "/bin/sh", "sh", "-c", PPPCOMMAND, NULL);
exit(15);
}
if(Event.xbutton.y>48&&Event.xbutton.x<26)
if(fork()==0) {
execl( "/bin/sh", "sh", "-c", "netscape", NULL);
exit(15);
}
break;
case 2:
if(Event.xbutton.y<32&&Event.xbutton.x<26) {
if(wmnetmode)
wmnetmode=0;
else
wmnetmode=1;
}
if(Event.xbutton.y>48&&Event.xbutton.x<26)
{
tempp=XFetchBytes(display,&qqqq);
pp=strtok(tempp, tokenss);
sprintf( nscommand, "%s%s%s", "netscape -remote 'openURL(",pp,")'" );
if(fork()==0) {
execl("/bin/sh", "sh", "-c", nscommand, NULL);
exit(15);
}
}
break;
case 3:
if(Event.xbutton.y>48&&Event.xbutton.x<26)
{
tempp=XFetchBytes(display,&qqqq);
pp=strtok(tempp,tokenss);
sprintf( nscommand, "%s%s%s", "netscape -remote 'openURL(",pp,", newwindow)'" );
if(fork()==0) {
execl( "/bin/sh", "sh", "-c", nscommand, NULL);
exit(15);
}
}
if(Event.xbutton.x>26) {
mode=1;
copyXPMArea(68,4,56,54,4,4);
}
break;
}
}
else if(mode==1) {
cd_getStatus(cd,0,0);
switch (Event.xbutton.button) {
case 1:
if(Event.xbutton.x<15&&Event.xbutton.y<17) {
if(cd_cur(cd,mode)==1||cd_cur(cd,mode)==2)
{
cd_doStop(cd);
song=cd_play(cd,cur_track);
}
else if(cd_cur(cd,mode)==-1) {
cd_getStatus(cd,1,1);
trax=cd_list(cd,tracks);
}
else
cd_doEject(cd);
}
else if(Event.xbutton.x<26&&Event.xbutton.x>15&&Event.xbutton.y<17) {
if(cd_cur(cd,mode)==1||cd_cur(cd,mode)==2) {
cd_doPause(cd);
}
else if(cd_cur(cd,mode)==-1) {
if(cd_getStatus(cd,1,0))
trax=cd_list(cd,tracks);
cd_doPlay(cd,0);
}
else
cd_doPlay(cd,song);
}
else if(Event.xbutton.x<15&&Event.xbutton.y>17&&Event.xbutton.y<32) {
if(--song<0)
song=trax-1;
cd_doPlay(cd,song);
}
else if(Event.xbutton.x<26&&Event.xbutton.x>15&&Event.xbutton.y<32&&Event.xbutton.y>17) {
if(++song>=trax)
song=0;
cd_doPlay(cd,song);
}
else if(Event.xbutton.x>27) {
mixwhich=((Event.xbutton.y/16)+1);
changevolume=1;
xvol=Event.xbutton.x;
curvol=(xvol-28)*3;
if(curvol<8)
curvol=0;
if(curvol>92)
curvol=100;
mixer_setvols(mixer,curmixer[mixwhich],curvol,curvol);
curmixvol[mixwhich]=curvol;
}
break;
case 3:
mode=0;
copyXPMArea(68,59,56,54,4,4);
qq=149;
break;
}
}
break;
case MotionNotify:
if(changevolume==1) {
xvol=Event.xmotion.x;
curvol=(xvol-28)*3;
if(curvol<8)
curvol=0;
if(curvol>92)
curvol=100;
mixer_setvols(mixer,curmixer[mixwhich],curvol,curvol);
curmixvol[mixwhich]=curvol;
}
break;
case ButtonRelease:
if(changevolume==1)
changevolume=0;
break;
}
}
usleep(40000L);
}
}
void update_stat_cpu( void ) {
long bisi=0, aidl=0;
long cistat=0, cidle=0;
int i,j;
char *temp, *p, *tokens = " \t\n";
temp=(char*)malloc(128);
rewind(fp_stat);
while (fgets(temp, 128, fp_stat)) {
if (strstr(temp, "cpu")) {
p = strtok(temp, tokens);
for (i=0; i<3; i++) {
p = strtok(NULL, tokens);
bisi += atol(p);
}
p = strtok(NULL, tokens);
aidl = atol(p);
}
}
cpustat[roll] = bisi - cpustatlast;
cpustatlast = bisi;
cpuidle[roll] = aidl - cpuidlelast;
cpuidlelast = aidl;
for(i=0;i<5;i++) {
cistat += cpustat[i];
cidle += cpuidle[i];
}
copyXPMArea(0, 59, 32, 12, 28, 4);
j = (cistat + cidle);
if(j)
j=(cistat * 32)/j;
if(j > 32)
j=32;
copyXPMArea(32, 59, j, 12, 28, 4);
free(temp);
}
void update_stat_io( void ) {
long bisi=0;
long ostat=0,oidle=0;
int i,j;
char *temp, *p, *tokens = " \t\n";
temp=(char*)malloc(128);
rewind(fp_stat);
while (fgets(temp, 128, fp_stat)) {
if (strstr(temp, "disk_rio") || strstr(temp, "disk_wio")) {
p = strtok(temp, tokens);
for (i=0; i<4; i++) {
p = strtok(NULL, tokens);
bisi += atol(p);
}
}
}
iostat[roll] = bisi - iostatlast;
iostatlast = bisi;
for(i=0;i<5;i++) {
ostat += iostat[i];
oidle += IOMAX;
}
copyXPMArea(0, 59, 32, 12, 28, 18);
j = (ostat + oidle);
if (j)
j=(ostat * 32)/j;
if (j > 32)
j=32;
copyXPMArea(32, 59, j, 12, 28, 18);
free(temp);
}
void update_stat_mem( void ) {
int j;
char *temp, *p, *tokens = " \t\n";
temp=(char*)malloc(128);
rewind(fp_meminfo);
fgets(temp, 128, fp_meminfo);
fgets(temp, 128, fp_meminfo);
p = strtok(temp, tokens);
p = strtok(NULL, tokens);
memtotal = atol(p);
p = strtok(NULL, tokens);
memused = atol(p);
p = strtok(NULL, tokens);
p = strtok(NULL, tokens);
p = strtok(NULL, tokens);
memused -= atol(p);
p = strtok(NULL, tokens);
memused -= atol(p);
fgets(temp, 128, fp_meminfo);
p = strtok(temp, tokens);
p = strtok(NULL, tokens);
swaptotal = atol(p);
p = strtok(NULL, tokens);
swapused = atol(p);
copyXPMArea(0, 59, 32, 12, 28, 32);
j = memtotal;
if (j)
j = (memused * 32) / j;
if (j > 32)
j = 32;
copyXPMArea(32, 59, j, 12, 28, 32);
copyXPMArea(0, 59, 32, 12, 28, 46);
j = swaptotal;
if (j)
j = (swapused * 32) / j;
if (j > 32)
j = 32;
copyXPMArea(32, 59, j, 12, 28, 46);
free(temp);
}
void update_stat_ppp( void ) {
long bisi, pisi;
long pupstat,pupidle,pdostat,pdoidle;
int i,j;
char *temp, *pp, *tokens = " :\t\n";
temp=(char*)malloc(128);
bisi=pisi=pupstat=pupidle=pdostat=pdoidle=0;
rewind(fp_ppp);
while(fgets(temp, 128, fp_ppp)) {
if(strstr(temp, NETDEVICE)) {
pp = strtok(temp, tokens);
pp = strtok(NULL, tokens);
bisi=atol(pp);
pp = strtok(NULL, tokens);
pp = strtok(NULL, tokens);
pp = strtok(NULL, tokens);
pp = strtok(NULL, tokens);
pp = strtok(NULL, tokens);
pp = strtok(NULL, tokens);
pp = strtok(NULL, tokens);
pp = strtok(NULL, tokens);
pisi=atol(pp);
}
}
dostat[roll] = bisi - dostatlast;
dostatlast = bisi;
doidle[roll] = DOWNMAX - dostat[roll];
upstat[roll] = pisi - upstatlast;
upstatlast = pisi;
upidle[roll] = UPMAX - upstat[roll];
for(i=0;i<5;i++)
{
pupstat += upstat[i];
pupidle += upidle[i];
pdostat += dostat[i];
pdoidle += doidle[i];
}
for(i=0;i<19;i++)
{
wmnup[i]=wmnup[i+1];
wmndo[i]=wmndo[i+1];
}
copyXPMArea(28, 72, 22, 26, 4, 4);
j = (pdostat + pdoidle);
if (j)
j = (pdostat * 26) / j;
if (j > 26)
j = 26;
wmndo[19]=j;
j = (pupstat + pupidle);
if (j)
j = (pupstat * 26) / j;
if (j > 26)
j = 26;
wmnup[19]=j;
if(wmnetmode) {
for(i=0;i<20;i++)
{
copyXPMArea(16, 72, 1, wmnup[i], 5+i, 4);
copyXPMArea(5, 98-wmndo[i], 1, wmndo[i], 5+i, 30-wmndo[i]);
}
}
else {
copyXPMArea(4,98-wmndo[19], 10, wmndo[19], 4, 30-wmndo[19]);
copyXPMArea(16,72,10,wmnup[19],16,4);
}
free(temp);
}
void defaults(void) {
char temp[128],*token;
char *tokens=" =\n";
char *rcfilename=".wmmmnnrc";
char *rcfile;
char *HOME;
char *NAME;
HOME=getenv("HOME");
NAME=getenv("USER");
rcfile=(char*)malloc((strlen(HOME)+strlen(rcfilename)+1)*sizeof(char));
sprintf(rcfile,"%s%s%s",HOME,"/",rcfilename);
fp_rc=fopen(rcfile,"r");
if(!fp_rc) {
printf("cannot find %s\n", rcfile);
exit(13);
}
MAILDIR="";
UPMAX=0;
DOWNMAX=0;
IOMAX=0;
while(fgets(temp,128,fp_rc)) {
if(strstr(temp,"MAILCOMMAND")) {
token=strtok(temp,tokens);
MAILCOMMAND=strdup(strcpy(token,(temp+12)));
}
if(strstr(temp,"PPPCOMMAND")) {
token=strtok(temp,tokens);
PPPCOMMAND=strdup(strtok(NULL,tokens));
}
if(strstr(temp,"NETDEVICE")) {
token=strtok(temp,tokens);
NETDEVICE=strdup(strtok(NULL,tokens));
}
if(strstr(temp,"MAILDIR")) {
token=strtok(temp,tokens);
MAILDIR=strdup(strtok(NULL,tokens));
}
if(strstr(temp,"UPMAX")) {
token=strtok(temp,tokens);
token=strdup(strtok(NULL,tokens));
UPMAX=atoi(token);
}
if(strstr(temp,"DOWNMAX")) {
token=strtok(temp,tokens);
token=strdup(strtok(NULL,tokens));
DOWNMAX=atoi(token);
}
if(strstr(temp,"IOMAX")) {
token=strtok(temp,tokens);
token=strdup(strtok(NULL,tokens));
IOMAX=atoi(token);
}
}
fclose(fp_rc);
if(MAILDIR=="") {
MAILDIR=(char*)malloc((strlen("/var/spool/mail/")+strlen(NAME)+1)*sizeof(char));
sprintf(MAILDIR,"%s%s","/var/spool/mail/",NAME);
}
if(!UPMAX)
UPMAX=300;
if(!DOWNMAX)
DOWNMAX=300;
if(!IOMAX)
IOMAX=2;
}
..........................................................
例子代码3:
(from: google,
logrotate.c:)
...........................................................
static int runScript(char *logfn, char *script)
{
int rc;
if (debug) {
message(MESS_DEBUG, "running script with arg %s: \"%s\"\n",
logfn, script);
return 0;
}
if (!fork()) {
("/bin/sh", "sh", "-c", script, NULL);
exit(1);
}
wait(&rc);
return rc;
}
...........................................................