|
|
1.1 ! root 1: /* ! 2: * entry.c ! 3: * ! 4: * Keep track about all children processes. ! 5: * ! 6: */ ! 7: #include <stdio.h> ! 8: #include <string.h> ! 9: #include "cron.h" ! 10: ! 11: #define HUGE 1024 /* Size of the hostname+domain, is it enough */ ! 12: ! 13: extern char *mktemp(); /* Generate temporary name */ ! 14: extern int gethostname(); /* Get host name */ ! 15: extern int getdomain(); /* Get domain name */ ! 16: ! 17: child_id *add_entry(), /* Add an new entry to a link list */ ! 18: *find_entry(), /* Find an entry in the link list */ ! 19: *del_entry(); /* Remove an entry from the link list */ ! 20: void mail_entry(); /* Send mail to user if command failed */ ! 21: ! 22: extern child_id *current; /* Pointer to the lasr allocated struct. */ ! 23: ! 24: /* ! 25: * Add a new entry to the link list. Return pointer to the new entry or ! 26: * NULL if entry cannot be allocated. ! 27: */ ! 28: child_id *add_entry(pid, u_name, c_time, cmd) ! 29: int pid; /* Process ID */ ! 30: char *u_name; /* User name */ ! 31: time_t c_time; /* Time when command started */ ! 32: char *cmd; /* Command */ ! 33: { ! 34: register child_id *pst; ! 35: ! 36: /* Structure child_id has one extracharacter at the end */ ! 37: if ((pst = (child_id *) malloc(sizeof(child_id) + strlen(cmd))) ! 38: == NULL) { ! 39: fprintf(stderr, "crond: out of memory\n"); ! 40: } else { /* Write information about child to a table */ ! 41: pst->prev = current; ! 42: if (current != NULL) ! 43: current->next = pst; ! 44: current = pst; ! 45: current->next = NULL; ! 46: current->pid = pid; ! 47: strncpy(current->name, u_name, MAX_UNAME - 1); ! 48: current->time = c_time; ! 49: strcpy(current->command, cmd); ! 50: Dprint("add_entry: added ID is %d, ", current->pid); ! 51: } ! 52: return current; ! 53: } ! 54: ! 55: /* ! 56: * Find an entry by process id. Return pointer to the entry or ! 57: * NULL if entry not found. ! 58: */ ! 59: child_id *find_entry(pid) ! 60: int pid; ! 61: { ! 62: register child_id *pst; ! 63: ! 64: Dprint("find_entry: request ID is %d. List of incore pids:\n", pid); ! 65: for (pst = current; pst != NULL; pst = pst->prev) { ! 66: Dprint(" %d ", pst->pid); ! 67: if (pst->pid == pid) ! 68: break; ! 69: } ! 70: Dprint("find_entry: found ID is %d\n", pst->pid); ! 71: return pst; ! 72: } ! 73: ! 74: /* ! 75: * Delete entry. Return pointer to the last allocated entry ("current"). ! 76: */ ! 77: child_id *del_entry(corpse) ! 78: child_id *corpse; /* Entry that should be deleted */ ! 79: { ! 80: child_id *pst; ! 81: ! 82: Dprint("del_entry: ID should be %d\t", corpse->pid); ! 83: Dprint("next_id is %d\t", corpse->next->pid); ! 84: Dprint("prev_id is %d\n", corpse->prev->pid); ! 85: ! 86: if (corpse == NULL) ! 87: return current; ! 88: ! 89: if ((pst = corpse->prev) != NULL) { ! 90: pst->next = corpse->next; ! 91: Dprint("del_entry: prev_id is %d\n", pst->pid); ! 92: } ! 93: ! 94: if ((pst = corpse->next) != NULL) { ! 95: pst->prev = corpse->prev; ! 96: Dprint("del_entry: next_id is %d\n", pst->pid); ! 97: } ! 98: ! 99: if (corpse->next == NULL) { ! 100: pst = corpse->prev; ! 101: free(corpse); ! 102: return pst; ! 103: } ! 104: free(corpse); ! 105: return current; ! 106: } ! 107: ! 108: char tmpFoo[] = "/tmp/cronXXXXXX"; /* Temporary file */ ! 109: ! 110: /* ! 111: * Mail entry. Send mail to a user about failed command. ! 112: */ ! 113: void mail_entry(entry) ! 114: child_id *entry; ! 115: { ! 116: char mailBuf[MAX_STR_LEN]; /* Message buffer */ ! 117: char tmpName[20]; /* Name of the temporary file */ ! 118: char tmpBuf[HUGE]; /* Huge buffer for hostname */ ! 119: FILE *fp; /* Pointer to a temporary file */ ! 120: int sz; /* Size of the Hostname + '.' */ ! 121: ! 122: *tmpBuf = 0; /* Just to have */ ! 123: ! 124: strcpy(tmpName, mktemp(tmpFoo)); ! 125: if ((fp = fopen(tmpName, "w+")) == NULL) { ! 126: fprintf(stderr, "crond: cannot open temporary file %s.\n", ! 127: tmpName); ! 128: return; ! 129: } ! 130: ! 131: if (gethostname(tmpBuf, HUGE)) ! 132: strcat(tmpBuf, ""); ! 133: else { ! 134: strcat(tmpBuf, "."); ! 135: sz = strlen(tmpBuf); ! 136: if (getdomain(&tmpBuf[sz], HUGE - sz)); ! 137: strcat(tmpBuf, ""); ! 138: } ! 139: fprintf(fp, "From: CRON@%s\n", tmpBuf); ! 140: fprintf(fp, "Subject: failed command\n\n"); ! 141: fprintf(fp, "Time was %sCommand was \"%s\".\n\n", ! 142: ctime(&(entry->time)), entry->command); ! 143: fprintf(fp, "Have a good one cron!\n"); ! 144: rewind(fp); ! 145: sprintf(mailBuf, "smail %s < %s", entry->name, tmpName); ! 146: system(mailBuf); ! 147: fclose(fp); ! 148: unlink(tmpName); ! 149: } ! 150:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.