]> andersk Git - moira.git/blame - regtape/employee.pc
Fixes to build with `gcc' instead of `gcc -traditional' on suns. (Needed
[moira.git] / regtape / employee.pc
CommitLineData
469f80df 1/* $Header$
2 */
3
4#include <stdio.h>
9f5e5c05 5#include <string.h>
469f80df 6#include <ctype.h>
7#include <sys/time.h>
932028de 8#include <moira.h>
9#include <moira_site.h>
02cd9ede 10EXEC SQL INCLUDE sqlca;
469f80df 11
12
02cd9ede 13#define WHO 11859 /* root */
14#define PROG "emp-tape"
469f80df 15
397e9044 16#define MAX_ID_VALUE 31999
469f80df 17#define MIN_ID_VALUE 101
18
19/* File format is:
20
210-8 id number
229-38 name
2339-62 office address
2463-74 phone1
2575-86 phone2
2687-106 dept
27107-156 title
28157-186 username
29187-241 host
30
31*/
32
33#define LOC_ID 0
34#define LOC_NAME 9
35#define LOC_OFFICE 39
36#define LOC_PHONE 63
37#define LOC_PHONE2 75
38#define LOC_DEPT 87
39#define LOC_TITLE 107
40#define LOC_USERNAME 157
41#define LOC_HOST 187
42
43#define LEN_ID 9
a6e9fead 44#define LEN_NAME 30
45#define LEN_OFFICE 24
469f80df 46#define LEN_PHONE 12
47#define LEN_PHONE2 12
a6e9fead 48#define LEN_DEPT 20
49#define LEN_TITLE 50
50#define LEN_USERNAME 30
469f80df 51#define LEN_HOST 55
52
53
54struct entry {
a6e9fead 55 char *name;
469f80df 56 char *last;
57 char *first;
58 char *middle;
59 char *title;
60 char *class;
61 char *id;
62 char *eid;
63 char *dept;
64 char *address;
65 char *phone;
a6e9fead 66 char *phone2;
469f80df 67};
68
69
70char *whoami;
71int newfinger = 0;
72
9f5e5c05 73#define sqlfail() (sqlca.sqlcode && sqlca.sqlcode != 1403)
bd22473a 74#define SQL_DUPLICATE -2112
3e77c6a3 75
469f80df 76
77main(argc, argv)
78int argc;
79char **argv;
02cd9ede 80{
469f80df 81 FILE *in;
82 struct entry *e, *get_next_entry();
83 int i, wait = 0;
84 char buf[BUFSIZ], *file = NULL;
9f5e5c05 85EXEC SQL BEGIN DECLARE SECTION;
86 char *db="moira";
87EXEC SQL END DECLARE SECTION;
469f80df 88
9f5e5c05 89 whoami = strrchr(argv[0], '/');
469f80df 90 if (whoami)
91 whoami++;
92 else
93 whoami = argv[0];
94
9f5e5c05 95 setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
96 setvbuf(stderr, NULL, _IOLBF, BUFSIZ);
97
469f80df 98 for (i = 1; i < argc; i++) {
99 if (!strcmp(argv[i], "-w"))
100 wait++;
101 else if (!strcmp(argv[i], "-D"))
102 setenv("ING_SET", "set printqry");
103 else if (!strcmp(argv[i], "-n"))
104 newfinger++;
105 else if (file != NULL)
325821e4 106 fprintf(stderr, "Usage: %s [-w] [-D] [-n] inputfile\n", whoami);
469f80df 107 else
108 file = argv[i];
109 }
110
111 in = fopen(file, "r");
112 if (in == NULL) {
113 fprintf(stderr, "Unable to open %s for input\n", file);
114 exit(1);
115 }
116
2168fb4b 117 initialize_sms_error_table();
325821e4 118
9f5e5c05 119 EXEC SQL CONNECT :db IDENTIFIED BY :db;
3e77c6a3 120 if (sqlca.sqlcode != 0) {
9f5e5c05 121 dbmserr("opening database", sqlca.sqlcode);
3e77c6a3 122 exit(1);
123 }
469f80df 124
125 while (e = get_next_entry(in)) {
9b2c129e 126 again:
469f80df 127 process_entry(e);
3e77c6a3 128 EXEC SQL COMMIT WORK;
129 if (sqlca.sqlcode != 0) {
9f5e5c05 130 dbmserr("committing work", sqlca.sqlcode);
131 exit(1);
3e77c6a3 132 }
469f80df 133 if (wait) {
134 printf("Next");
135 fflush(stdout);
136 gets(buf);
137 }
138 }
139
469f80df 140 exit(0);
02cd9ede 141}
469f80df 142
143
144char *substr(buf, key)
145char *buf;
146char *key;
147{
148 int l;
149
150 for (l = strlen(key); *buf; buf++)
151 if (!strncmp(buf, key, l))
152 return(buf);
153 return(NULL);
154}
155
156
157struct entry *get_next_entry(in)
158FILE *in;
159{
160 static struct entry e;
98a7b0ee 161 static char buf[BUFSIZ], mid[16], eid[16];
a6e9fead 162 static char name[LEN_NAME+1], sname[LEN_NAME+1], id[LEN_ID+1];
163 static char office[LEN_OFFICE+1], phone[LEN_PHONE+1], phone2[LEN_PHONE2+1];
164 static char dept[LEN_DEPT+1], title[LEN_TITLE+1], username[LEN_USERNAME+1];
165 static char host[LEN_HOST+1];
039f9637 166 int ends_sr, ends_jr, ends_iii, ends_iv, ends_ii, ends_v;
469f80df 167 char *p;
168
4763be9c 169 if (fgets(buf, sizeof(buf), in) == NULL)
170 return((struct entry *)NULL);
a6e9fead 171
172 strncpy(id, &buf[LOC_ID], LEN_ID); id[LEN_ID] = 0;
173 strncpy(name, &buf[LOC_NAME], LEN_NAME); name[LEN_NAME] = 0;
174 strncpy(office, &buf[LOC_OFFICE], LEN_OFFICE); office[LEN_OFFICE] = 0;
175 strncpy(phone, &buf[LOC_PHONE], LEN_PHONE); phone[LEN_PHONE] = 0;
176 strncpy(phone2, &buf[LOC_PHONE2], LEN_PHONE2); phone2[LEN_PHONE2] = 0;
177 strncpy(dept, &buf[LOC_DEPT], LEN_DEPT); dept[LEN_DEPT] = 0;
178 strncpy(title, &buf[LOC_TITLE], LEN_TITLE); title[LEN_TITLE] = 0;
179 strncpy(username, &buf[LOC_USERNAME], LEN_USERNAME); username[LEN_USERNAME] = 0;
180 strncpy(host, &buf[LOC_HOST], LEN_HOST); host[LEN_HOST] = 0;
181
182 strcpy(sname, name);
183 e.name = strtrim(sname);
9f5e5c05 184 p = strchr(name, ',');
469f80df 185 if (p)
186 *p = 0;
a6e9fead 187 e.last = strtrim(name);
469f80df 188 if (p) {
a6e9fead 189 p++;
190 while (isspace(*p))
191 p++;
192 e.first = p;
9f5e5c05 193 if (p = strchr(e.first, ' ')) {
469f80df 194 *p = 0;
a6e9fead 195 e.first = strtrim(e.first);
469f80df 196 e.middle = strtrim(p + 1);
a6e9fead 197 } else {
198 e.first = strtrim(e.first);
199 e.middle = "";
200 }
201 } else {
202 e.first = "";
203 e.middle = "";
204 }
039f9637 205 ends_sr = ends_jr = ends_iii = ends_iv = ends_ii = ends_v = 0;
469f80df 206 LookForSt(e.last);
207 LookForO(e.last);
039f9637 208 LookForJrAndIII(e.last, &ends_sr, &ends_jr, &ends_iii, &ends_iv,
209 &ends_ii, &ends_v);
210 LookForJrAndIII(e.first, &ends_sr, &ends_jr, &ends_iii, &ends_iv,
211 &ends_ii, &ends_v);
469f80df 212 FixCase(e.last);
213 FixCase(e.first);
214 FixCase(e.middle);
215
a6e9fead 216 e.id = id;
469f80df 217 e.eid = eid;
218 EncryptID(e.eid, e.id, e.first, e.last);
219
a6e9fead 220 e.address = strtrim(office);
221 e.phone = strtrim(phone);
222 e.phone2 = strtrim(phone2);
223 e.dept = strtrim(dept);
224 e.title = strtrim(title);
469f80df 225
226 e.class = "MITS";
41dd7d99 227 if (substr(e.title, "PROF") || substr(e.title, "LECTURE"))
469f80df 228 e.class = "FACULTY";
469f80df 229
469f80df 230 return(&e);
231}
232
233
234process_entry(e)
235struct entry *e;
02cd9ede 236{
3e77c6a3 237 int changed, nochange, encrypted;
469f80df 238 char buf[BUFSIZ], *from, *to;
02cd9ede 239 EXEC SQL BEGIN DECLARE SECTION;
3e77c6a3 240 char *first, *last, *middle, *eid, *sid, *name, *title, *phone2, *rdept, *rtitle;
241 char *raddr, *rhphone, *rophone, *prog;
242 char class[9], oaddr[25], ophone[17], dept[128], dfirst[17], dlast[17], dmiddle[17];
243 int id, status, who;
02cd9ede 244 EXEC SQL END DECLARE SECTION;
469f80df 245
41dd7d99 246 /* Don't process Lincoln Labs */
247 if (!strncmp(e->address, "LL", 2))
248 return;
249
3e77c6a3 250 who = WHO;
251 prog = PROG;
469f80df 252 first = e->first;
9e4455c2 253 if (strlen(first) > 16)
254 first[16] = 0;
469f80df 255 last = e->last;
9e4455c2 256 if (strlen(last) > 16)
257 last[16] = 0;
3e77c6a3 258 middle = e->middle;
469f80df 259 eid = e->eid;
325821e4 260 sid = e->id;
469f80df 261 id = 0;
3e77c6a3 262 encrypted = 0;
325821e4 263
264 /* Get user info */
3e77c6a3 265 EXEC SQL SELECT users_id, first, last, middle, type, office_addr, office_phone, department, status
266 INTO :id, :dfirst, :dlast, :dmiddle, :class, :oaddr, :ophone, :dept, :status
02cd9ede 267 FROM users
3e77c6a3 268 WHERE clearid = :sid;
269 if (sqlfail()) {
270 if (sqlca.sqlcode == SQL_DUPLICATE) {
271 com_err(whoami, 0, "duplicate ID number %s on user %s %s", sid, first, last);
272 return;
273 } else
274 sqlexit();
275 }
469f80df 276 if (id == 0) {
3e77c6a3 277 EXEC SQL SELECT users_id, first, last, middle, type, office_addr, office_phone, department, status
278 INTO :id, :dfirst, :dlast, :dmiddle, :class, :oaddr, :ophone, :dept, :status
02cd9ede 279 FROM users
280 WHERE last = :last and first = :first and clearid = :eid;
9f5e5c05 281 if (sqlfail() && sqlca.sqlcode != SQL_DUPLICATE) {
6f1556b3 282 sqlexit();
283 }
3e77c6a3 284 encrypted++;
325821e4 285 if (id == 0) {
286 newuser(e);
287 return;
288 }
469f80df 289 }
325821e4 290
2168fb4b 291 /* Update class/state if necessary. (Exclude several spacial cases.) */
e1695a1c 292 if (strcmp(e->class, strtrim(class)) &&
2168fb4b 293 strcmp(class, "STAFF") && strcmp(class, "SIPBMEM") &&
294 strcmp(class, "KNIGHT")) {
469f80df 295 com_err(whoami, 0, "updating class for %s %s from %s to %s",
296 first, last, class, e->class);
2168fb4b 297 if (status == US_NOT_ALLOWED)
a6e9fead 298 status = US_NO_LOGIN_YET;
2168fb4b 299 if (status == US_ENROLL_NOT_ALLOWED)
a6e9fead 300 status = US_ENROLLED;
469f80df 301 strcpy(class, e->class);
02cd9ede 302 EXEC SQL UPDATE users
9f5e5c05 303 SET type = NVL(:class,CHR(0)), status = :status, modtime = SYSDATE,
3e77c6a3 304 modby = :who, modwith = :prog
02cd9ede 305 WHERE users_id = :id;
3e77c6a3 306 if (sqlca.sqlcode != 0) {
9f5e5c05 307 dbmserr("updating user", sqlca.sqlcode);
308 exit(1);
3e77c6a3 309 }
310 }
311
312 /* Update name if necessary */
313 if (strcmp(first, strtrim(dfirst)) ||
314 strcmp(last, strtrim(dlast)) ||
315 strcmp(middle, strtrim(dmiddle))) {
316 com_err(whoami, 0, "updating real name for %s %s", first, last);
317 EXEC SQL UPDATE users
9f5e5c05 318 SET first = NVL(:first,CHR(0)), last = NVL(:last,CHR(0)),
319 middle = NVL(:middle,CHR(0)), modby = :who, modwith = :prog,
320 modtime = SYSDATE
3e77c6a3 321 WHERE users_id = :id;
322 if (sqlca.sqlcode != 0) {
9f5e5c05 323 dbmserr("updating name", sqlca.sqlcode);
324 exit(1);
3e77c6a3 325 }
469f80df 326 }
325821e4 327
469f80df 328 changed = nochange = 0;
3e77c6a3 329 if (encrypted) changed++;
469f80df 330 strcpy(buf, e->address);
9f5e5c05 331 while (to = strchr(buf, ','))
469f80df 332 *to = ';';
9f5e5c05 333 while (to = strchr(buf, ':'))
469f80df 334 *to = ';';
335 if (newfinger) {
a6e9fead 336 if (oaddr[0] == ' ' && buf[0]) {
469f80df 337 strncpy(oaddr, buf, 16);
338 oaddr[16] = 0;
339 changed++;
6eb764c5 340 } else if (strncmp(strtrim(oaddr), buf, 15))
469f80df 341 nochange++;
342 } else {
343 if (strncmp(strtrim(oaddr), buf, 15))
344 changed++;
345 strncpy(oaddr, buf, 16);
346 oaddr[16] = 0;
347 }
348 from = e->phone;
349 to = buf;
350 while (*from) {
351 if (isdigit(*from))
352 *to++ = *from;
353 from++;
354 }
355 *to = 0;
356 if (newfinger) {
357 if (ophone[0] == ' ') {
358 strncpy(ophone, buf, 16);
359 ophone[16] = 0;
6eb764c5 360 } else if (strncmp(strtrim(ophone), buf, 11))
469f80df 361 nochange++;
362 } else {
363 if (strncmp(strtrim(ophone), buf, 11))
364 changed++;
365 strncpy(ophone, buf, 16);
366 ophone[16] = 0;
367 }
368 FixCase(e->dept);
a6e9fead 369 FixCase(e->title);
469f80df 370 if (newfinger) {
371 if (dept[0] == ' ') {
372 strncpy(dept, e->dept, 12);
373 dept[12] = 0;
6eb764c5 374 } else if (strncmp(strtrim(dept), e->dept, 11))
469f80df 375 nochange++;
376 } else {
377 if (strncmp(strtrim(dept), e->dept, 11))
378 changed++;
379 strncpy(dept, e->dept, 12);
380 dept[12] = 0;
381 }
325821e4 382 sid = e->id;
383 name = e->name;
384 rdept = e->dept;
385 rtitle = e->title;
386 raddr = e->address;
387 rhphone = e->phone;
388 rophone = e->phone2;
469f80df 389 if (changed) {
390 com_err(whoami, 0, "updating finger for %s %s", first, last);
9f5e5c05 391 EXEC SQL UPDATE users
392 SET office_addr = NVL(:oaddr,CHR(0)),
393 office_phone = NVL(:ophone,CHR(0)), department = NVL(:dept,CHR(0)),
394 fmodtime = SYSDATE, fmodby = :who, fmodwith = :prog,
395 xname = NVL(:name,CHR(0)), xdept = NVL(:rdept,CHR(0)),
396 xtitle = NVL(:rtitle,CHR(0)), xaddress = NVL(:raddr,CHR(0)),
397 xphone1 = NVL(:rhphone,CHR(0)), xphone2 = NVL(:rophone,CHR(0)),
398 xmodtime = SYSDATE, clearid = NVL(:sid,CHR(0))
02cd9ede 399 WHERE users_id = :id;
3e77c6a3 400 if (sqlca.sqlcode != 0) {
9f5e5c05 401 dbmserr(NULL, sqlca.sqlcode);
402 exit(1);
3e77c6a3 403 }
325821e4 404 } else {
9f5e5c05 405 EXEC SQL UPDATE users
406 SET xname = NVL(:name,CHR(0)), xdept = NVL(:rdept,CHR(0)),
407 xtitle = NVL(:rtitle,CHR(0)), xaddress = NVL(:raddr,CHR(0)),
408 xphone1 = NVL(:rhphone,CHR(0)), xphone2 = NVL(:rophone,CHR(0)),
409 xmodtime = SYSDATE, clearid = NVL(:sid,CHR(0))
02cd9ede 410 WHERE users_id = :id;
3e77c6a3 411 if (sqlca.sqlcode != 0) {
9f5e5c05 412 dbmserr(NULL, sqlca.sqlcode);
413 exit(1);
3e77c6a3 414 }
a6e9fead 415 }
02cd9ede 416}
469f80df 417
418
419newuser(e)
420struct entry *e;
02cd9ede 421{
469f80df 422 char *from, *to;
02cd9ede 423 EXEC SQL BEGIN DECLARE SECTION;
424 int id, uid, st, who;
425 char *last, *first, *class, *middle, login[9], *sid, fullname[65], *prog;
426 char oaddr[81], ophone[17], dept[128], *name, *title, phone2[17];
427 char *rdept, *rhphone, *rophone;
428 EXEC SQL END DECLARE SECTION;
429
430 who = WHO;
431 prog = PROG;
469f80df 432 strncpy(oaddr, e->address, 16);
a6e9fead 433 oaddr[16] = 0;
9f5e5c05 434 while (to = strchr(oaddr, ','))
469f80df 435 *to = ';';
9f5e5c05 436 while (to = strchr(oaddr, ':'))
469f80df 437 *to = ';';
438 from = e->phone;
439 to = ophone;
440 while (*from) {
441 if (isdigit(*from))
442 *to++ = *from;
443 from++;
444 }
445 *to = 0;
a6e9fead 446 FixCase(e->dept);
469f80df 447 strncpy(dept, e->dept, 12);
a6e9fead 448 dept[12] = 0;
469f80df 449
3e77c6a3 450 id = set_next_users_id(0);
451 uid = set_next_uid(1);
469f80df 452 sprintf(login, "#%d", uid);
453 last = e->last;
454 first = e->first;
455 middle = e->middle;
469f80df 456 class = e->class;
457 if (*middle)
458 sprintf(fullname, "%s %s %s", first, middle, last);
459 else
460 sprintf(fullname, "%s %s", first, last);
2168fb4b 461 st = US_NO_LOGIN_YET;
325821e4 462
463 sid = e->id;
464 name = e->name;
465 rdept = e->dept;
466 title = e->title;
467 rhphone = e->phone;
468 rophone = e->phone2;
469
9f5e5c05 470 EXEC SQL INSERT INTO users
471 (login, users_id, unix_uid, shell, last, first, middle, status,
02cd9ede 472 clearid, type, modtime, modby, modwith, fullname, office_addr,
473 office_phone, department, fmodtime, fmodby, fmodwith,
474 potype, xname, xdept, xtitle, xaddress, xphone1, xphone2, xmodtime)
9f5e5c05 475 VALUES (:login, :id, :uid, '/bin/athena/tcsh',
476 NVL(:last,CHR(0)), NVL(:first,CHR(0)), NVL(:middle,CHR(0)),
477 :st, NVL(:sid,CHR(0)), NVL(:class,CHR(0)), SYSDATE, :who, :prog,
478 NVL(:fullname,CHR(0)), NVL(:oaddr,CHR(0)), NVL(:ophone,CHR(0)),
479 NVL(:dept,CHR(0)), SYSDATE, :who, :prog, 'NONE',
480 NVL(:name,CHR(0)), NVL(:rdept,CHR(0)), NVL(:title,CHR(0)),
481 NVL(:oaddr,CHR(0)), NVL(:rhphone,CHR(0)), NVL(:rophone,CHR(0)),
482 SYSDATE);
3e77c6a3 483 if (sqlca.sqlcode != 0) {
9f5e5c05 484 dbmserr("adding user", sqlca.sqlcode);
485 exit(1);
3e77c6a3 486 } else
487 com_err(whoami, 0, "adding user %s %s", e->first, e->last);
02cd9ede 488}
469f80df 489
490
3e77c6a3 491set_next_users_id(limit)
27736587 492 int limit;
02cd9ede 493{
494 EXEC SQL BEGIN DECLARE SECTION;
3e77c6a3 495 int rowcount, flag, value, retval;
496 EXEC SQL END DECLARE SECTION;
497
9f5e5c05 498 EXEC SQL SELECT value INTO :value FROM numvalues
3e77c6a3 499 WHERE name = 'users_id';
500 if (sqlfail()) sqlexit();
501 if (sqlca.sqlerrd[2] != 1) {
502 EXEC SQL ROLLBACK;
503 com_err(whoami, MR_INTERNAL, "values table inconsistancy");
504 exit(1);
505 }
506
507 flag = 0;
9f5e5c05 508 EXEC SQL SELECT users_id INTO :flag FROM users
3e77c6a3 509 WHERE users_id = :value;
510 if (sqlfail()) sqlexit();
511 if (sqlca.sqlerrd[2] == 0)
512 flag = 0;
513 while (flag) {
514 value++;
515 if (limit && value > MAX_ID_VALUE)
516 value = MIN_ID_VALUE;
517 flag = 0;
9f5e5c05 518 EXEC SQL SELECT users_id INTO :flag FROM users
3e77c6a3 519 WHERE users_id = :value;
520 if (sqlfail()) sqlexit();
521 if (sqlca.sqlerrd[2] == 0)
522 flag = 0;
523 }
524
525 retval = value++;
526 if (limit && value > MAX_ID_VALUE)
527 value = MIN_ID_VALUE;
9f5e5c05 528 EXEC SQL UPDATE numvalues SET value = :value
3e77c6a3 529 WHERE name = 'users_id';
530 if (sqlca.sqlcode != 0) {
9f5e5c05 531 dbmserr("assigning ID", sqlca.sqlcode);
9b2c129e 532 exit(1);
3e77c6a3 533 }
534 return(retval);
535}
536
537set_next_uid(limit)
538 int limit;
539{
540 EXEC SQL BEGIN DECLARE SECTION;
541 int rowcount, flag, value, retval;
02cd9ede 542 EXEC SQL END DECLARE SECTION;
469f80df 543
9f5e5c05 544 EXEC SQL SELECT value INTO :value FROM numvalues
545 WHERE name = 'unix_uid';
3e77c6a3 546 if (sqlfail()) sqlexit();
02cd9ede 547 if (sqlca.sqlerrd[2] != 1) {
548 EXEC SQL ROLLBACK;
549 com_err(whoami, MR_INTERNAL, "values table inconsistancy");
550 exit(1);
469f80df 551 }
552
02cd9ede 553 flag = 0;
9f5e5c05 554 EXEC SQL SELECT unix_uid INTO :flag FROM users WHERE unix_uid = :value;
3e77c6a3 555 if (sqlfail()) sqlexit();
02cd9ede 556 if (sqlca.sqlerrd[2] == 0)
557 flag = 0;
558 while (flag) {
469f80df 559 value++;
27736587 560 if (limit && value > MAX_ID_VALUE)
469f80df 561 value = MIN_ID_VALUE;
02cd9ede 562 flag = 0;
9f5e5c05 563 EXEC SQL SELECT unix_uid INTO :flag FROM users WHERE unix_uid = :value;
3e77c6a3 564 if (sqlfail()) sqlexit();
02cd9ede 565 if (sqlca.sqlerrd[2] == 0)
566 flag = 0;
469f80df 567 }
568
3e77c6a3 569 retval = value++;
02cd9ede 570 if (limit && value > MAX_ID_VALUE)
571 value = MIN_ID_VALUE;
9f5e5c05 572 EXEC SQL UPDATE numvalues SET value = :value WHERE name = 'unix_uid';
3e77c6a3 573 if (sqlca.sqlcode != 0) {
9f5e5c05 574 dbmserr("assigning ID", sqlca.sqlcode);
3e77c6a3 575 exit(1);
576 }
577 return(retval);
578}
579
580
581sqlexit()
582{
9f5e5c05 583 dbmserr(NULL, sqlca.sqlcode);
3e77c6a3 584 EXEC SQL ROLLBACK WORK;
585 exit(1);
02cd9ede 586}
9f5e5c05 587
588dbmserr(char *where, int what)
589{
590 char err_msg[256];
591 int bufsize=256, msglength=0;
592
593 sqlglm(err_msg, &bufsize, &msglength);
594 err_msg[msglength]=0;
595
596 if(where)
597 com_err(whoami, 0, "DBMS error %swhile %s", err_msg, where);
598 else
599 com_err(whoami, 0, "DBMS error %s", err_msg);
600}
This page took 0.188868 seconds and 5 git commands to generate.