|
|
1.1 root 1: /****** apsend.mkhd.c *****/
2:
3: #include <stdio.h>
4: #include <pwd.h>
5: #include <time.h>
6: #include <ctype.h>
7: #include "apsend.h"
8:
9: main()
10: {
11: FILE *hdfile,*dtfile;
12: char header[160],tempbuf[80],*temp,tempbuf1[80],*temp1,tempbuf2[80],*temp2;
13: char tarray[20],parray[6],narray[8];
14: char *pid, *acct, *bin, *passacct, *nodename, *version, *aversion, *mhinfo, c;
15: char *tempbin, *tempacct;
16: int uid, i, astatus, passtype, found;
17: struct passwd *getpwuid(), *ps;
18: struct tm *localtime(), *lt;
19: long time(), now;
20: char *asctime(), *at, *getenv();
21:
22: for (i=0;i<160;i++) {
23: header[i] = ' ';
24: }
25: for (i=0;i<80;i++) {
26: tempbuf[i] = '\0';
27: tempbuf1[i] = '\0';
28: tempbuf2[i] = '\0';
29: }
30: temp = tempbuf;
31: temp1 = tempbuf1;
32: temp2 = tempbuf2;
33: found = passtype = 0;
34: astatus = 1;
35: tempbin = tempacct = 0;
36:
37: pid = getenv("PID");
38: strcpy (parray,pid);
39: nodename = getenv("NODE");
40: strcpy (narray,nodename);
41: sprintf (&header[UJN],"%s.%s",narray,parray);
42: uid = getuid();
43: ps = getpwuid(uid);
44: if (ps == NULL) {
45: printf ("login not found; job not submitted\n");
46: exit (1);
47: }
48: strcpy (&header[ULOG],ps->pw_name);
49:
50: if ((mhinfo = getenv("MHINFO")) != NULL) {
51: strcpy (temp1,mhinfo);
52: if ((tempbuf1[5] == ',') || (tempbuf1[5] == '\0'))
53: i = 5;
54: else
55: i = 6;
56: tempbuf1[i] = tempbuf1[i+34] = '\0';
57: tempbin = &tempbuf1[i+1];
58: strcpy (&header[BIN],tempbin);
59: tempacct = temp1;
60: }
61: if (((bin = getenv("MAILADDR")) != NULL) || (((bin = getenv("BBIN")) != NULL) && (*bin != '0'))) {
62: strcpy (temp2,bin);
63: tempbuf2[34] = '\0';
64: strcpy (&header[BIN],temp2);
65: }
66: else
67: bin = tempbin;
68: if ((acct = getenv("ACCOUNT")) != NULL){
69: strcpy (temp2,acct);
70: if ((tempbuf2[5] == ',') || (tempbuf2[5] == '\0'))
71: i = 5;
72: else
73: i = 6;
74: tempbuf2[i] = '\0';
75: acct = temp2;
76: }
77: else
78: acct = tempacct;
79: if (acct != NULL){
80: astatus = chkacct( acct,i);
81: if (astatus != 0){
82: printf ("valid GCOS account number needed; job not submitted\n");
83: exit(2);
84: }
85: strcpy (&header[MHACCT],acct);
86: }
87:
88: /* try to get GCOS account and/or bin info from passwd file */
89: /* determine which kind of passwd file we have:
90: if no '(' in GCOS field, must be research type;
91: typical format is ':mhxxxx,myyy:'
92: if ')' found, followed by < 5 char string, must be ISCC standard style;
93: typical format is ':zzzzz(mhxxxx)myyy,zzzzz:' ; trailing ',zzzzz' optional;
94: if ')' found followed by 5-6 char string, must be USG style;
95: typical format is ':zzzzz(mhxxxx)mhxxxx,myyy:';
96: use account number immediately following ')';
97: */
98:
99: if ((acct == NULL) || (bin == NULL)){
100: passacct = ps->pw_gecos;
101: strcpy (temp,passacct);
102: if ((acct == NULL) && (tempbuf[0] == '\0')){
103: printf ("valid GCOS account number needed; job not submitted\n");
104: exit(3);
105: }
106: for (i=0;i<80;i++){
107: if (tempbuf[i] == '('){
108: passtype=2;
109: break;
110: }
111: if ((tempbuf[i] == ':' ) || (tempbuf[i] == '\0')){
112: passtype=1;
113: break;
114: }
115: }
116: if (passtype == 2){
117: for (i=0;i<80;i++){
118: if (tempbuf[i] == ')')
119: found = i;
120: if ((found != 0) && (tempbuf[i] == ','))
121: if (((i - found) == 6) || ((i - found) == 7))
122: passtype = 3;
123: if ((tempbuf[i] == ':') || (tempbuf[i] == '\0'))
124: break;
125: }
126: }
127: if (passtype == 1){
128: passacct = temp;
129: while ((c = *temp++) != '\0')
130: if (c == ',') break;
131: }
132: if (passtype == 2){
133: while (*temp++ != '(');
134: passacct = temp;
135: while ((c = *temp++) != '\0')
136: if (c == ')') break;
137: }
138: if (passtype == 3){
139: while (*temp++ != ')');
140: passacct = temp;
141: while ((c = *temp++) != '\0')
142: if (c == ',') break;
143: }
144: if (bin == NULL)
145: strcpy (&header[BIN],temp);
146: temp--;
147: *temp = '\0';
148: i = temp - passacct;
149: if (acct == NULL){
150: astatus = chkacct( passacct,i);
151: if (astatus != 0){
152: printf ("valid GCOS account number needed; job not submitted\n");
153: exit(4);
154: }
155: strcpy (&header[MHACCT],passacct);
156: }
157: }
158: now = time((long *)0);
159: lt = localtime(&now);
160: sprintf (&header[TODAPS],"%02d",lt->tm_mon+1);
161: sprintf (&header[TODAPS+2],"%02d",lt->tm_mday);
162: sprintf (&header[TODAPS+4],"%02d",lt->tm_hour);
163: sprintf (&header[TODAPS+6],"%02d",lt->tm_min);
164: sprintf (&header[TODAPS+8],"%02d",lt->tm_sec);
165: version = getenv("VERS");
166: strcpy (tarray,version);
167: sprintf (&header[VERSION],"%s",tarray);
168: aversion = getenv("AVERS");
169: strcpy (tarray,aversion);
170: sprintf (&header[AVERSION],"%s",tarray);
171: sprintf (&header[159],"%c",'\n');
172: for (i=0;i<160;i++)
173: if (header[i] == '\0')
174: header[i] = ' ';
175: strcpy (tarray,"/tmp/apshead");
176: strncat (tarray,parray,5);
177: hdfile = fopen(tarray,"w");
178: strcpy (tarray,"/tmp/apsdate");
179: strncat (tarray,parray,5);
180: dtfile = fopen(tarray,"w");
181: if (hdfile == NULL || dtfile == NULL){
182: printf ("can't open /tmp file(s); job not submitted\n");
183: exit(5);
184: }
185: for (i=0;i<160;i++){
186: c = header[i];
187: putc(c,hdfile);
188: }
189: at = asctime(lt);
190: fprintf (dtfile,"%s",at);
191: exit(0);
192: }
193: chkacct(acct,n)
194: char acct[]; int n;
195: {
196: if ( n == 5){
197: if ((acct[0] == 'm') || (acct[0] == 'M')){
198: acct[6] = '\0';
199: acct[5] = acct[4];
200: acct[4] = acct[3];
201: acct[3] = acct[2];
202: acct[2] = acct[1];
203: acct[1] = 'h';
204: }
205: else
206: return (1);
207: }
208: if ((isalpha(acct[0]) != 0) && (isalpha(acct[1]) != 0) &&
209: (isalnum (acct[2]) != 0) && (isdigit (acct[3]) != 0) &&
210: (isdigit (acct[4]) != 0) && (isdigit (acct[5]) != 0))
211: ;
212: else
213: return (1);
214: if ((acct[2] == '0') && (acct[3] == '0') && (acct[4] == '0')
215: && (acct[5] == '0'))
216: return (2);
217: else
218: return (0);
219: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.