📄 cron.c
字号:
#include <sys/time.h>#include <time.h>#include <sys/types.h>#include <fcntl.h>#include <sys/stat.h>#include <stdio.h>#include <syslog.h>#include <errno.h>#include <sys/file.h>#include <pwd.h>#include <string.h>#include <sys/ipc.h>#include <sys/sem.h>#include <unistd.h>#include <signal.h>#include <sys/wait.h>#include "cron.h"static char ProgramName[]="my_cron";//static int minute_rec[MINUTE_RANGE];//static int hour_rec[HOUR_RANGE];//static int day_of_mon_rec[DAY_OF_MOU_RANGE];//static int mon_of_year_rec[MONTH_OF_YEAR_RANGE];//static int day_of_week_rec[MONTH_OF_YEAR_RANGE];int timerunning;date_rec *head = NULL;int daemon_init(){ pid_t pid; if( (pid = fork()) < 0) return -1; else if(pid != 0) /* parent exit */ exit(0); setsid(); chdir("/"); umask(0); /* close stdin, stdout and stderr*/ freopen("/dev/null", "r", stdin); freopen("/dev/null", "w", stdout); freopen("/dev/null", "w", stderr); return 0;}void log_err(char *error){ openlog(ProgramName,LOG_PID,LOG_USER); syslog(LOG_ERR, error);}static int get_next_token(char *buffer,char *line,int *pt){ int i = 0; while (line[*pt] == ' ' || line[*pt] == '\t') { (*pt)++; } if (line[*pt] == ',') { (*pt)++; return 4; } else if (isdigit(line[*pt])) { buffer[i++] = line[*pt]; (*pt)++; while (isdigit(line[*pt])) { buffer[i++] = line[*pt]; (*pt)++; } if (line[*pt] == ',') { buffer[i] = '\0'; (*pt)++; return 3; } else if (line[*pt] == ' ' || line[*pt] == '\t') { buffer[i] = '\0'; while(line[*pt] == ' ' || line[*pt] == '\t') (*pt)++; if(line[*pt] == ',') { (*pt)++; return 3; } else return 1; } else { return 5; } } else if (line[*pt] == '*') { (*pt)++; return 2; } else { return 5; }}static int add_rec(){ char n[MAX_LINE]; date_rec * temp; snprintf(n,MAX_LINE,"%s: malloc fail to add new record!",ProgramName); if((temp = (date_rec *)malloc(sizeof(date_rec))) == NULL) { log_err(n); return(0); } memset(temp,0,sizeof(date_rec)); temp->next = NULL; temp->next = head; head = temp; return 1;}static void del_rec(){ date_rec * p; if(head == NULL) return; else { p = head; while(head) { p = head->next; free(head); head = p; } } head = NULL;}static int check_number(char *buffer,int i){ int num; int value[5][2] = {{0,59},{0,23},{1,31},{1,12},{0,6}}; num = atoi(buffer); if(num >= value[i][0] && num <= value[i][1]) return num; else return -1;}static void record_it(date_rec * d,int i,int num){ int flag = 1; if(num == '*') flag = 0; switch(i) { case 0: if(flag) //d->minute_rec[num] = 1; MARK(d->minute_rec,num); else //memset(d->minute_rec,1,sizeof(d->minute_rec)); SET(d->minute_rec); break; case 1: if(flag) //d->hour_rec[num] = 1; MARK(d->hour_rec,num); else //memset(d->hour_rec,1,sizeof(d->hour_rec)); SET(d->hour_rec); break; case 2: if(flag) //d->day_of_mon_rec[num] = 1; MARK(d->day_of_mon_rec,num); else //memset(d->day_of_mon_rec,1,sizeof(d->day_of_mon_rec)); SET(d->day_of_mon_rec); break; case 3: if(flag) //d->mon_of_year_rec[num] = 1; MARK(d->mon_of_year_rec,num); else //memset(d->mon_of_year_rec,1,sizeof(d->mon_of_year_rec)); SET(d->mon_of_year_rec); break; case 4: if(flag) //d->day_of_week_rec[num] = 1; MARK(d->day_of_week_rec,num); else //memset(d->day_of_week_rec,1,sizeof(d->day_of_week_rec)); SET(d->day_of_week_rec); break; default: break; }}int load_rec(){ date_rec * current_date; char n[MAX_FNAME]; char error[MAX_LINE]; char *User; FILE *crontab; struct passwd *pw; /*----------------------------------------------*/ char line[MAX_LINE]; char buffer[MAX_FNAME]; char * f; int pt = 0; int i = 0; int flag = 0; int can_gets = 0; int finish = 0; int num = 0; int temp; /* open the crontab */ if (!(pw = getpwuid(getuid()))) { snprintf(error,MAX_LINE,"%s: your UID isn't in the passwd file.\n", ProgramName); log_err(error); return(0); } /* dup the user id*/ if (((User=strdup(pw->pw_name)) == NULL)) { snprintf(error,MAX_LINE, "%s: Memory allocation error\n",ProgramName); log_err(error); return(0); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -