GSI Object Oriented Online Offline (Go4) GO4-6.4.0
Loading...
Searching...
No Matches
rawProcn.c
Go to the documentation of this file.
1/**********************************************************************
2 * Copyright:
3 * GSI, Gesellschaft fuer Schwerionenforschung mbH
4 * Planckstr. 1
5 * D-64291 Darmstadt
6 * Germany
7 * created 14. 2.1996, Horst Goeringer
8 **********************************************************************
9 * rawProcn.c
10 * utility programs for gStore package: client and server
11 **********************************************************************
12 * rawAddStrings: add 2 messages avoiding overflows
13 * rawCheckClientFile: check gStore naming conventions for client file
14 * rawGetFSpName: get file space name from user specification
15 * rawGetHLName: get high level object name from path
16 * rawGetLLName: get low level object name from file name
17 * rawGetFileSize: get file size (byte) via Posix call stat
18 * rawGetPathName: get path name from high level object name
19 * rawQueryFile: get query information for single file
20 * rawRecvError: receive error message
21 * rawRecvHead: receive common buffer header
22 * rawRecvHeadC: receive common buffer header and check
23 * rawRecvRequest: receive request for next buffer
24 * rawRecvStatus: receive status buffer
25 * rawSendRequest: send request for next buffer
26 * rawSendStatus: send status buffer
27 * rawTestFileName: verify that specified name is a valid file name
28 **********************************************************************
29 * 23. 4.1996., H.G: rawGetHLName: remove device dependency in hl-name,
30 * as in ADSM 213 class may be set in dsmSendObj
31 * 16. 5.1997, H.G.: keep only modules for all clients here
32 * 16. 6.1997, H.G.: ported to Linux
33 * 15.10.1997, H.G.: rawCheckAuth moved to rawCheckAuth.c
34 * 22.10.1997, H.G.: rawDelFilelist added
35 * 8. 7.1998, H.G.: new filetype STREAM
36 * 19.10.1998, H.G.: rawapitd.h introduced, dsmapitd.h removed
37 * 1.12.2000, H.G.: rawSendStatus: send also buffer request headers
38 * 7. 2.2001, H.G.: new function rawQueryString
39 * 21. 2.2001, H.G.: renamed file rawQueryFile.c -> rawProcQuery.c
40 * function rawQueryList added
41 * 18. 5.2001, H.G.: function rawDelFilelist -> rawcliproc.c
42 * merge into new file rawcliproc.c: rawProcQuery.c
43 * 18. 6.2001, H.G.: function rawTestFile: renamed to rawTestFileName,
44 * handle mixed case
45 * 2.11.2001, H.G.: ported to W2000
46 * 14.11.2001, H.G.: take alternate delimiter for Windows into account
47 * 9. 1.2002, H.G.: rawGetLLName: pass object and delimiter as argument
48 * 19. 2.2002, H.G.: rawGetFileSize added
49 * 20. 2.2002, H.G.: rawGetCmdParms removed (unused)
50 * 7. 3.2002, H.G.: rawQueryPrint: new type GSI_MEDIA_INCOMPLETE
51 * rawRecvHeadC added
52 * 7. 6.2002, H.G.: rawRecvHeadC: check always for error status
53 * 23. 7.2002, H.G.: replace old printf() -> fprintf(fLogFile)
54 * 5. 8.2002, H.G.: rawQueryFile: handle QUERY_RETRIEVE, QUERY_STAGE
55 * 14.10.2002, H.G.: ported to Lynx
56 * 31. 1.2003, H.G.: use rawdefn.h
57 * 17. 2.2003, H.G.: rawCheckFilelist, rawCheckObjlist -> rawcliprocn.c
58 * 3. 6.2003, H.G.: renamed from rawprocn to rawProcn
59 * 9. 7.2003, H.G.: rawTestFileName: call rawGetFileSize to identify
60 * directories
61 * 13. 8.2003, H.G.: rawQueryPrint: add user who staged file in output
62 * 5.12.2003, H.G.: rawRecvStatus: convert status header to host format
63 * 28. 1.2004, H.G.: GSI_MEDIA_CACHE: rawQueryPrint, rawQueryString
64 * GSI_MEDIA_INCOMPLETE: in rawQueryString
65 * 26. 5.2004, H.G.: rawQueryPrint, rawQueryString: new print modes:
66 * stage status not checked
67 * 29. 6.2004, H.G.: rawRecvHeadC: recv error msg, if write cache full
68 * 24.11.2004, H.G.: rawQueryFile: handle status values
69 * STA_NO_ACCESS, STA_ARCHIVE_NOT_AVAIL
70 * 25. 1.2005, H.G.: use rawapitd-gsin.h, new media names:
71 * GSI_..._LOCKED, GSI_..._INCOMPLETE
72 * 1. 2.2005, H.G.: ported to Linux and gcc322
73 * 25.11.2005, H.G.: rename rawGetFSName to rawGetFSpName (file space),
74 * rawGetFSName in rawProcPooln (get file system name)
75 * 3. 4.2006, H.G.: ported to sarge
76 * 29. 9.2006, H.G.: rawQueryPrint: handle ATL server
77 * 4.10.2006, H.G.: rawQueryPrint: handle cacheDB entry V4
78 * 2.11.2006, H.G.: rawQueryString: handle ATL server, cacheDB entry V4
79 * 8.12.2006, H.G.: rawQueryFile: handle query on several ATL Servers
80 * 8. 5.2008, H.G.: rawGetFullFile: move -> rawCliProcn.c
81 * rawQueryFile: moved from rawCliProcn.c, repl printf
82 * rawQueryList: moved from rawCliProcn.c, repl printf
83 * 16. 5.2008, H.G.: rawGetHLName: remove './' and trailing '/.' in path
84 * 28. 8.2008, H.G.: rawQueryPrint, rawQueryString:
85 * remove ATL server no. in query output
86 * 6.10.2008, H.G.: replace perror by strerr(errno), improve msgs
87 * rawRecvRequest: better handling rc=0 from recv()
88 * 30.10.2008, H.G.: rawQueryFile,rawQueryList: better: rc=0 from recv()
89 * 5.11.2008, H.G.: rawRecvError: better handling rc=0 from recv()
90 * arg 3: char ** -> char *
91 * rawRecvHead: better handling rc=0 from recv()
92 * arg 3: char ** -> char *
93 * rawRecvStatus: better handling rc=0 from recv()
94 * arg 3: char ** -> char *
95 * 11.11.2008, H.G.: add suggestions of Hakan
96 * 3.12.2008, H.G.: add suggestions of Hakan, part II
97 * 12.12.2008, H.G.: handle CUR_QUERY_LIMIT
98 * 4. 5.2009, H.G.: rawRecvHeadC: improve debug output
99 * 7. 5.2009, H.G.: new entry rawAddStrings
100 * 22. 6.2008, H.G.: replace long->int if 64bit client (ifdef SYSTEM64)
101 * 8. 7.2008, H.G.: rawQueryPrint/String: print filesize with %10d
102 * 23.11.2009, H.G.: rawTestFileName: inhibit '*', '?' as file name part
103 * 10.12.2009, H.G.: rawQueryFile, rawQueryPrint, rawQueryString:
104 * handle enhanced structure srawObjAttr
105 * old version info also available in new structure
106 * rawQueryList not upgraded, obviously unused???
107 * 29. 1.2010, H.G.: replace MAX_FILE -> MAX_FULL_FILE in:
108 * static string cPath,
109 * rawTestFilePath: cTemp
110 * enhance cMsg: 256 -> STATUS_LEN in:
111 * rawRecvHeadC, rawRecvRequest
112 * 5. 2.2010, H.G.: move rawQueryPrint,rawQueryString -> rawCliProcn.c
113 * move rawQueryList -> Unused.c
114 * 11. 2.2010, H.G.: rename rawTestFilePath -> rawCheckClientFile
115 * rawCheckClientFile: all checks of local file name
116 * concerning gStore conventions are done here
117 * 3. 5.2010, H.G.: rawGetFileSize: specific error msg if filesize>2GB
118 * 23. 8.2010, H.G.: rawGetFileSize, rawTestFileName:
119 * remove SYSTEM64, allow "long"
120 * 5.11.2010, H.G.: reset errno after error,
121 * better error handling after recv/send
122 * 18.11.2010, H.G.: rawRecvError: provide also incomplete msg
123 **********************************************************************
124 */
125
126/* file deepcode ignore BufferOverflow: <comment the reason here> */
127
128#include <stdio.h>
129#include <string.h>
130#include <errno.h>
131
132#ifdef _MSC_VER /* Windows */
133#include <sys\types.h>
134#include <winsock.h>
135#include <windows.h>
136#include <process.h>
137#include <sys\stat.h>
138#else /* all Unix */
139#include <sys/stat.h>
140#include <ctype.h>
141#include <stdlib.h>
142#include <unistd.h>
143#include <netinet/in.h>
144
145#ifdef Lynx /* Lynx */
146#include <sys/types.h>
147#include <socket.h>
148#elif Linux /* Linux */
149#include <sys/socket.h>
150#else /* AIX */
151#include <sys/socket.h>
152#endif
153
154#endif /* all Unix */
155
156#include "rawapitd.h"
157#include "rawapitd-gsin.h"
158#include "rawcommn.h"
159#include "rawdefn.h"
160#include "rawentn.h"
161#include "rawapplcli.h"
162
163extern FILE *fLogFile;
164
165static char cPath[MAX_FULL_FILE] = "";
166static char cNamefs[MAX_OBJ_FS] = "";
167static char cNamehl[MAX_OBJ_HL] = "";
168static char *pcNull = (char *) "";/* to be returned in case of error */
169 /* return(NULL) works in AIX, but not in VMS */
170
171static int iObjAttr = sizeof(srawObjAttr);
172
173/*********************************************************************
174 * rawAddStrings
175 * add 2 messages avoiding string overflows
176 * created 7.5.2009, Horst Goeringer
177 *********************************************************************
178 */
179
180int rawAddStrings(char *pcMsg1, /* 1st string, always complete */
181 int iMaxLength1, /* max length of string1 */
182 char *pcMsg2, /* added string, possibly cut */
183 int iMaxLength2, /* max length of string2 */
184 int iErrno, /* = 0: add contents of string2
185 > 0: add system error msg (errno) */
186 char *pcMsgE, /* error msg in case of problem */
187 int iMaxLengthE) /* max length of error string */
188{
189 char cModule[32]="rawAddStrings";
190 int iDebug = 0;
191
192 int iRC = 0; /* = 0: okay
193 < 0: problem:
194 =-1: specified string too large
195 =-2: string without contents provided
196 =-3: max length <=0 provided
197 =-4: iErrno, but string2 < STATUS_LEN byte
198 =-5: error string < STATUS_LEN byte provided
199 > 0: no. of chars cut from the 2nd string */
200 int iString1 = 0;
201 int iString2 = 0;
202 int iStringE = 0;
203 int iString = 0; /* sum of string1 + string2 */
204 int iMinLen = STATUS_LEN; /* for pcMsgE, if needed */
205 char cMsg[STATUS_LEN] = ""; /* internal copy */
206 char *pcc;
207
208 iString1 = strlen(pcMsg1);
209 iString2 = strlen(pcMsg2);
210 iString = iString1 + iString2;
211
212 if (iDebug)
213 {
214 fprintf(fLogFile, "\n-D- begin %s\n", cModule);
215 fprintf(fLogFile, " string1 (%d byte, max %d byte):\n %s",
216 iString1, iMaxLength1, pcMsg1);
217 if (iErrno)
218 fprintf(fLogFile, " add msg for errno=%d\n", errno);
219 else
220 fprintf(fLogFile, " add string2 (%d byte, max %d byte):\n %s",
221 iString2, iMaxLength2, pcMsg2);
222 }
223
224 if ( (iString1 <= iMaxLength1) &&
225 (iString2 <= iMaxLength2) )
226 {
227 if (iErrno)
228 {
229 if (iMaxLength2 >= iMinLen)
230 {
231 sprintf(pcMsg2, " %s\n", strerror(errno));
232 iString2 = strlen(pcMsg2);
233 iString = iString1 + iString2;
234 }
235 else
236 {
237 iRC = -4;
238 sprintf(cMsg,
239 "-E- %s: 2nd string (%d byte) possibly too small for system error: requ. %d byte\n",
240 cModule, iMaxLength2, iMinLen);
241
242 goto gErrorMsg;
243 }
244 } /* (iErrno) */
245
246 if (iString < iMaxLength1)
247 {
248 strcat(pcMsg1, pcMsg2);
249 if (iDebug) fprintf(fLogFile,
250 " returned msg (%d byte):\n %s", iString, pcMsg1);
251 }
252 else
253 {
254 strncat(pcMsg1, pcMsg2, iMaxLength1-iString1-1);
255 strcat(pcMsg1, "\n");
256 iRC = iString -iMaxLength1;
257 if (iDebug)
258 {
259 fprintf(fLogFile, " returned msg:\n %s", pcMsg1);
260 pcc = pcMsg2;
261 pcc+= iMaxLength1-iString1-1;
262 fprintf(fLogFile, " skipped msg part:\n %s", pcc);
263 }
264 }
265 }
266 else
267 {
268 if (iMaxLength1 <= 0)
269 {
270 iRC = -3;
271 sprintf(cMsg, "-E- %s: 1st string length (%d byte) invalid\n",
272 cModule, iMaxLength1);
273 }
274 if (iMaxLength2 <= 0)
275 {
276 iRC = -3;
277 sprintf(cMsg, "-E- %s: 2nd string length (%d byte) invalid\n",
278 cModule, iMaxLength2);
279 }
280 else if (iString == 0)
281 {
282 iRC = -2;
283 sprintf(cMsg, "-E- %s: empty strings provided\n", cModule);
284 }
285 else if (iString1 > iMaxLength1)
286 {
287 iRC = -1;
288 sprintf(cMsg, "-E- %s: 1st string longer (%d byte) than length provided (%d)\n",
289 cModule, iString1, iMaxLength1);
290 }
291 else if ( (iString2 > iMaxLength2) && (iErrno == 0) )
292 {
293 iRC = -1;
294 sprintf(cMsg, "-E- %s: 2nd string longer (%d byte) than length provided (%d)\n",
295 cModule, iString2, iMaxLength2);
296 }
297 }
298
299 if (iRC >= 0)
300 {
301 strcpy(pcMsgE, "");
302 goto gEndAddStrings;
303 }
304
305gErrorMsg:
306 iStringE = strlen(cMsg);
307 if (iDebug) fprintf(fLogFile,
308 " error string (%d byte, max %d byte):\n %s\n",
309 iStringE, iMaxLengthE, cMsg);
310
311 if (iMaxLengthE < iStringE)
312 {
313 iRC = -5;
314 fprintf(fLogFile, "-E- %s: size error string too small: max %d byte (needed %d)",
315 cModule, iMaxLengthE, iStringE);
316 strncat(pcMsgE, cMsg, iMaxLengthE);
317 fprintf(fLogFile, ", provided: %s\n", pcMsgE);
318 }
319 else
320 {
321 if (iDebug) fprintf(fLogFile, "%s", cMsg);
322 strcpy(pcMsgE, cMsg);
323 }
324
325gEndAddStrings:
326 if (iDebug)
327 fprintf(fLogFile, "-D- end %s: rc=%d\n\n", cModule, iRC);
328
329 return iRC;
330
331} /* rawAddStrings */
332
333/********************************************************************
334 * rawCheckClientFile:
335 * check client file name for gStore naming conventions
336 * verify that file path not generic
337 * if tape specified get tape drive name
338 * returns 0 if valid disk file name
339 * returns >0 if valid tape file name
340 *
341 * created 15. 3.96, Horst Goeringer
342 ********************************************************************
343 */
344
345int rawCheckClientFile( char *pcFile0, char **pcFile, char **pcTape)
346{
347
348 char cModule[32]="rawCheckClientFile";
349 int iDebug = 0;
350
351 int iloc, iRC, ii;
352 int iDevType = 1; /* default: disk */
353
354 bool_t bup = bFalse;
355
356 char cText[12] = "";
357 char cTemp[MAX_FULL_FILE] = "";
358 char *plocd = NULL, *plocs = NULL;
359 char *pdelim = NULL, *pgen = NULL;
360 const char *pcSemi = ";";
361 char *pcc = NULL, *pBufTape, *pBufFile;
362
363 if (iDebug) fprintf(fLogFile,
364 "\n-D- begin %s: test file %s\n", cModule, pcFile0);
365
366 pBufTape = *pcTape;
367 pBufFile = *pcFile;
368 strcpy(cTemp, pcFile0);
369
370 /* check if device name specified */
371 plocd = strchr(cTemp, *pcDevDelim);
372 if (plocd != NULL)
373 {
374 iRC = strncmp(cTemp, "/dev", 4);
375 {
376 fprintf(fLogFile,
377 "-E- invalid file name: %s\n path names must not contain '%s'\n",
378 pcFile0, pcDevDelim);
379 return(-2);
380 }
381
382 if (iRC)
383 pdelim = strrchr(cTemp, *pcFileDelim);
384 if ( (pdelim == NULL) || (pdelim > plocd) )
385 {
386 fprintf(fLogFile,
387 "-E- invalid disk file name: %s\n path names must not contain '%s'\n",
388 pcFile0, pcDevDelim);
389 return(-2);
390 }
391
392 pcc = plocd;
393 pcc++;
394 if (strlen(pcc) > MAX_TAPE_FILE)
395 {
396 ii = MAX_TAPE_FILE;
397 fprintf(fLogFile,
398 "-E- invalid tape file name: %s\n name too long: max %d byte after dev name\n",
399 pcFile0, ii);
400 return(-2);
401 }
402
403 iDevType = 2; /* tape, if Unix; if VMS: get it later */
404 iRC = strncmp(++pcc, "\0", 1);
405 if (iRC == 0)
406 {
407#ifdef VMS
408 fprintf(fLogFile,
409 "-E- file name must be specified explicitly\n");
410#else
411 fprintf(fLogFile, "-E- file name missing in %s\n", pcFile0);
412#endif
413 return(-2);
414 }
415 } /* (plocd != NULL) */
416
417#ifdef VMS
418 /* eliminate version number */
419 plocs = strchr(cTemp, *pcSemi);
420 if (plocs)
421 {
422 ++plocs;
423 iRC = isalnum(*plocs);
424 if (iRC) /* char after semicolon alphanum. */
425 {
426 iRC = isalpha(*plocs);
427 if (iRC == 0) /* char after semicolon no letter */
428 fprintf(fLogFile,
429 "-W- version number in file specification removed\n");
430 else
431 fprintf(fLogFile,
432 "-W- invalid version in file specification removed\n");
433 }
434 else
435 fprintf(fLogFile,
436 "-W- semicolon in file specification removed\n");
437 strncpy(--plocs, "\0", 1);
438 strcpy(pcFile0, cTemp);
439 }
440
441 iDevType = rawCheckDevice(cTemp, pcFile, pcTape);
442 switch(iDevType)
443 {
444 case 0:
445 if (iDebug) fprintf(fLogFile,
446 " no device name specified\n");
447 break;
448 case 1:
449 if (iDebug)
450 {
451 if (strlen(*pcFile) == 0)
452 fprintf(fLogFile, " disk device %s\n", *pcTape);
453 else
454 fprintf(fLogFile,
455 " file %s on disk %s\n", *pcFile, *pcTape);
456 }
457 break;
458 case 2:
459 if (iDebug)
460 {
461 if (strlen(*pcFile) == 0)
462 fprintf(fLogFile, " tape device %s\n", *pcTape);
463 else
464 fprintf(fLogFile, " file %s on tape %s\n", *pcFile, *pcTape);
465 }
466 break;
467 default:
468 fprintf(fLogFile, "-E- invalid file name %s\n", pcFile0);
469 return(-1);
470
471 } /* switch(iDevType) */
472#endif /* VMS */
473
474 if (iDevType == 2) /* tape */
475 {
476#ifndef VMS
477 /* check string after 1st device delimiter */
478 iRC = strncmp(pcc, pcDevDelim, 1);
479 if (iRC == 0)
480 {
481 fprintf(fLogFile,
482 "-E- node specification not allowed in file name: %s\n",
483 pcFile0);
484 return(-2);
485 }
486#endif /* Unix */
487
488 strncpy(plocd++, "\0", 1); /* cut string at colon */
489 strcpy(pBufTape, cTemp);
490#ifdef VMS
491 strncat(pBufTape, pcDevDelim, 1); /* append colon in VMS */
492
493#else
494 pgen = strchr(pBufTape, *pcStar);
495 if (pgen != NULL)
496 {
497 fprintf(fLogFile,
498 "-E- specified device %s has generic path\n", pBufTape);
499 fprintf(fLogFile,
500 " only the relative file name may be generic\n");
501 return(-1);
502 }
503#endif
504
505 strcpy(pBufFile, plocd);
506 if (iDebug) fprintf(fLogFile,
507 " file %s on tape %s\n", pBufFile, pBufTape);
508 strcpy(cText, "tape");
509 iRC = 1;
510
511 } /* (iDevType == 2) */
512 else
513 {
514 strcpy(pBufFile, cTemp);
515 strcpy(cText, "disk");
516 iRC = 0;
517 }
518
519 if (iDebug) fprintf(fLogFile,
520 " %s file %s\n", cText, pBufFile);
521
522 pdelim = strrchr(pBufFile, *pcFileDelim);
523 if (pdelim != NULL) /* path specified */
524 {
525#ifndef VMS
526 if (iDevType == 2) /* file on tape */
527 {
528 fprintf(fLogFile,
529 "-E- path in tape file name not allowed: %s\n", pBufFile);
530 return(-1);
531 }
532#endif
533
534 /* disk file prefixed with path */
535 pgen = strchr(pBufFile, *pcStar);
536 if (pgen == NULL)
537 pgen = strchr(pBufFile, *pcQM);
538 if ( (pgen != NULL) && (pgen < pdelim) )
539 {
540 fprintf(fLogFile,
541 "-E- specified %s file %s has wildcard chars in path name\n",
542 cText, pBufFile);
543 fprintf(fLogFile,
544 " only the relative file name may contain wildcard chars\n");
545 return(-1);
546 }
547
548 pdelim++; /* points to rel. file name */
549
550 } /* (pdelim != NULL) */
551 else pdelim = pBufFile;
552
553 ii = MAX_OBJ_LL - 2;
554 if (strlen(pdelim) > ii)
555 {
556 fprintf(fLogFile,
557 "-E- rel file name %s too long:\n has %ld chars, max allowed %d\n",
558 pdelim, (long) strlen(pdelim), ii);
559 return(-1);
560 }
561
562#ifndef VMS
563 /* tape: convert file name from uppercase if necessary */
564 if (iDevType == 2)
565 {
566 pcc = pdelim;
567 while (*pcc != '\0')
568 {
569 iloc = isupper(*pcc);
570 if (iloc != 0)
571 {
572 if (!bup) fprintf(fLogFile,
573 "-W- upper case in (relative) file name not supported: %s\n",
574 pdelim);
575 bup = bTrue;
576 *pcc = tolower(*pcc); /* change to lower case */
577 }
578 pcc++;
579 } /* while (*pcc != '\0') */
580 }
581
582 if (bup)
583 fprintf(fLogFile, " instead assumed: %s\n", pdelim);
584#endif
585
586 if (iDebug) fprintf(fLogFile,
587 "\n end %s: file name %s okay\n", cModule, pcFile0);
588
589 return(iRC);
590
591} /* rawCheckClientFile */
592
593/**********************************************************************
594 * rawGetFSpName
595 * get file space name from user specification
596 * created 22.3.1996, Horst Goeringer
597 **********************************************************************
598 */
599
600char *rawGetFSpName( char *pcUser )
601{
602 char cModule[32]="rawGetFSpName";
603 int iDebug = 0;
604
605 char *pc;
606
607 if (iDebug)
608 fprintf(fLogFile, "\n-D- begin %s\n", cModule);
609
610 pc = pcUser;
611 if ( (strchr(pcUser, *pcStar) != NULL) ||
612 (strchr(pcUser, *pcQM) != NULL) )
613 {
614 fprintf(fLogFile,
615 "-E- %s: generic archive name '%s' not allowed\n",
616 cModule, pcUser);
617 return(pcNull);
618 }
619
620 strcpy(cNamefs, ""); /* initialize */
621 if (iDebug)
622 fprintf(fLogFile, "-D- %s: FS %s, in %s-%s, delim %s\n",
623 cModule, cNamefs, pcUser, pc, pcObjDelim);
624 if (strncmp(pc, pcObjDelim, 1) == 0)
625 pc++;
626 else
627 /* strncpy(cNamefs, pcObjDelim, 1); */
628 /* in adsmcli session: beginning with 2nd invocation,
629 gives incorrect results due to missing \0 ! H.G. 27.10.97 */
630 strcpy(cNamefs, pcObjDelim);
631
632 if (isalpha(*pc) == 0)
633 {
634 fprintf(fLogFile,
635 "-E- archive name '%s' must start with a letter\n", pc);
636 return(pcNull);
637 }
638
639 strcat(cNamefs, pcUser);
640 if (iDebug) fprintf(fLogFile,
641 "-D- end %s: FS %s\n", cNamefs, cModule);
642
643 return( (char *) cNamefs);
644
645} /* rawGetFSpName */
646
647/*********************************************************************
648 * rawGetHLName: get high level object name from path
649 *
650 * insert name part at beginning depending on device
651 * PLATFORM DEPENDENT
652 *
653 * created 16. 2.96, Horst Goeringer
654 *********************************************************************
655 */
656
657char *rawGetHLName( char *pcPath)
658{
659 char cModule[32]="rawGetHLName";
660 int iDebug = 0;
661
662 char *pcc;
663 char *pdelim;
664 char cNameTemp[MAX_OBJ_HL] = "";
665 int ii = 0, ii1 = 0;
666
667 if (iDebug) fprintf(fLogFile,
668 "\n-D- begin %s\n path specified: %s\n", cModule, pcPath);
669
670 pdelim = strchr(pcPath, *pcObjDelim);
671 if (pdelim != pcPath)
672 {
673 strcpy(cNamehl, pcObjDelim);
674 if (iDebug) fprintf(fLogFile,
675 " delimiter '%s' inserted at begin of archive path\n",
676 pcObjDelim);
677 strcat(cNamehl, pcPath);
678 }
679 else strcpy(cNamehl, pcPath);
680
681 pdelim = strstr(cNamehl, "/./");
682 if (pdelim != NULL)
683 {
684 strcpy(cNameTemp, cNamehl);
685 pdelim = strstr(cNameTemp, "/./");
686
687 while (pdelim != NULL)
688 {
689 ii++;
690 strncpy(pdelim, "\0", 1);
691 strcpy(cNamehl, cNameTemp);
692 pdelim++;
693 pdelim++;
694 strcat(cNamehl, pdelim);
695
696 strcpy(cNameTemp, cNamehl);
697 pdelim = strstr(cNameTemp, "/./");
698 }
699 if (iDebug) fprintf(fLogFile,
700 " %d unnecessary './' removed\n", ii);
701 }
702
703 pdelim = strstr(cNamehl, "/.");
704 if (pdelim != NULL)
705 {
706 pcc= cNamehl;
707 ii = strlen(cNamehl);
708 ii1 = pdelim - pcc;
709 if (ii1 < 0)
710 ii1 = -ii1;
711 if (ii1+2 == ii)
712 {
713 strncpy(pdelim, "\0", 1);
714 if (iDebug) fprintf(fLogFile,
715 " trailing '/.' removed\n");
716 }
717 }
718
719 if (iDebug) fprintf(fLogFile,
720 " hl name: %s\n-D- end %s\n\n", cNamehl, cModule);
721
722 return(cNamehl);
723
724} /* rawGetHLName */
725
726/*********************************************************************
727 * rawGetLLName: get low level object name from file name
728 * PLATFORM DEPENDENT
729 *
730 * created 16. 2.1996, Horst Goeringer
731 *********************************************************************
732 * 9. 1.2002, H.G.: pass object and delimiter as argument
733 *********************************************************************
734 */
735
736int rawGetLLName( char *pcFile, const char *pcDelimiter,
737 char *pcObject)
738{
739 char cModule[32] = "rawGetLLName";
740 int iDebug = 0;
741
742 char cNamell[MAX_OBJ_LL] = "";
743 char *ploc = NULL;
744
745 if (iDebug) fprintf(fLogFile,
746 "\n-D- begin %s\n file %s, object delimiter %s\n",
747 cModule, pcFile, pcDelimiter);
748
749 strcpy(cNamell, pcDelimiter);
750
751 ploc = strrchr(pcFile, *pcFileDelim);
752 if (ploc != NULL)
753 strcat(cNamell, ++ploc); /* begin copy after file delimiter */
754 else
755 {
756 ploc = strrchr(pcFile, *pcObjDelimAlt);
757 if (ploc != NULL)
758 strcat(cNamell, ++ploc);/* begin copy after file delimiter */
759 else
760 {
761#ifdef VMS
762 ploc = strrchr(pcFile, *pcDevDelim); /* look for disk device */
763 if (ploc != NULL)
764 strcat(cNamell, ++ploc);
765 /* begin copy after device delimiter */
766 else
767#endif
768 strcat(cNamell, pcFile);
769 }
770 }
771 strcpy(pcObject, cNamell);
772
773 if (iDebug) fprintf(fLogFile,
774 " ll name %s\n-D- end %s\n\n", pcObject, cModule);
775
776 return 0;
777
778} /* rawGetLLName */
779
780/**********************************************************************
781 * rawGetFileSize
782 * get file size (bytes)
783 * created 19.2.2002, Horst Goeringer
784 **********************************************************************
785 */
786
787int rawGetFileSize(char *pcFile,
788 unsigned long *piSize,
789 unsigned int *piRecl) /* needed only for VMS */
790{
791 char cModule[32] = "rawGetFileSize";
792 int iDebug = 0;
793
794 int iRC;
795 int iRecl = 0;
796 unsigned long iSize = 0;
797
798#ifdef _MSC_VER /* Windows */
799 struct _stat sFileStatus, *pFileStatus;
800#else /* Unix or VMS */
801 struct stat sFileStatus, *pFileStatus;
802#endif
803
804 if (iDebug) fprintf(fLogFile,
805 "\n-D- begin %s: file %s\n", cModule, pcFile);
806
807 pFileStatus = &sFileStatus;
808
809#ifdef _MSC_VER /* Windows */
810 iRC = _stat(pcFile, pFileStatus);
811#else /* Unix or VMS */
812 iRC = stat(pcFile, pFileStatus);
813#endif
814 if (iRC)
815 {
816 fprintf(fLogFile,
817 "-E- %s: file %s unavailable (stat)\n", cModule, pcFile);
818 if (errno)
819 {
820 fprintf(fLogFile, " %s\n", strerror(errno));
821
822 /* valid only for 32 bit OS */
823 if (strcmp(strerror(errno),
824 "Value too large for defined data type") == 0)
825 {
826 fprintf(fLogFile,
827 "-E- %s: file size of %s > 2 GByte: use 64 bit gStore client\n",
828 cModule, pcFile);
829
830 errno = 0;
831 return -99;
832 }
833 errno = 0;
834 }
835
836 return -1;
837 }
838
839#ifdef VMS
840 iRecl = pFileStatus->st_fab_mrs;
841#else
842#ifdef _MSC_VER
843 iRecl = 0; /* not available in Windows */
844#else
845 iRecl = pFileStatus->st_blksize;
846#endif
847#endif
848 iSize = pFileStatus->st_size;
849 if (pFileStatus->st_mode & S_IFREG)
850 {
851 iRC = 0;
852 if (iDebug) fprintf(fLogFile,
853 " file %s: size %lu, recl %d (byte)\n",
854 pcFile, iSize, iRecl);
855 }
856 else
857 {
858 if (pFileStatus->st_mode & S_IFDIR)
859 {
860 iRC = 1;
861 if (iDebug) fprintf(fLogFile,
862 "-W- %s is a directory, size %lu\n", pcFile, iSize);
863 }
864#ifndef _MSC_VER
865#ifndef VMS
866 else if (pFileStatus->st_mode & S_IFLNK)
867 {
868 iRC = 2;
869 if (iDebug) fprintf(fLogFile,
870 "-W- %s is a symbolic link, size %lu\n", pcFile, iSize);
871 }
872#endif
873#endif
874 else
875 {
876 iRC = 3;
877 if (iDebug) fprintf(fLogFile,
878 "-W- unexpected item %s, size %lu\n", pcFile, iSize);
879 }
880 }
881
882 *piRecl = iRecl;
883 *piSize = iSize;
884 if (iDebug)
885 fprintf(fLogFile, "-D- end %s\n\n", cModule);
886
887 return iRC;
888
889} /* rawGetFileSize */
890
891/*********************************************************************
892 * rawGetPathName: get path name from high level object name
893 *
894 * created 21. 3.1996, Horst Goeringer
895 *********************************************************************
896 * 23. 4.1996, H.G: no more device dependency in hl-name, as with
897 * ADSM V213 management class can be set in dsmSendObj
898 *********************************************************************
899 */
900
901char *rawGetPathName( char *pcNamehl)
902{
903 char cModule[32] = "rawGetPathName";
904 int iDebug = 0;
905
906 char *ploc = NULL, *ploc1 = NULL;
907 char *pcc;
908
909 if (iDebug)
910 fprintf(fLogFile, "-D- begin %s: hl: %s\n", cModule, pcNamehl);
911
912 if (strlen(pcNamehl) == 0)
913 {
914 fprintf(fLogFile, "-E- %s: high level name empty\n", cModule);
915 return(pcNull);
916 }
917
918 pcc = pcNamehl;
919 ploc = strchr(pcNamehl, *pcObjDelim);
920 ploc1 = strchr(pcNamehl, *pcObjDelimAlt);
921 if ( (ploc != pcc) && (ploc1 != pcc) )
922 {
923 fprintf(fLogFile,
924 "-E- %s: invalid prefix in high level name %s\n",
925 cModule, pcNamehl);
926 return(pcNull);
927 }
928
929 strcpy(cPath, pcc);
930 if (iDebug) fprintf(fLogFile,
931 "-D- end %s: path %s\n\n", cModule, cPath);
932
933 return cPath;
934
935} /* rawGetPathName */
936
937/********************************************************************
938 * rawQueryFile: get query information for single file
939 *
940 * used for tape input handled sequentially
941 * buffers for communication and query info allocated in calling
942 * procedure
943 ********************************************************************
944 */
945
947 int iSocket,
948 int iAltMaster, /* currently unused */
949 srawComm *pCommBuf,
950 void **pQueryBuf)
951{
952 char cModule[32] = "rawQueryFile";
953 int iDebug = 0;
954
955 int iATLServer = -1; /* =0: all, =1: aixtsm1, =2: gsitsma */
956 int iNameWC = -1;
957 int iRC;
958 int iAction;
959 int iIdent, iQuery = -1, iAttrLen;
960 int iQueryAll = 0;
961 int iStatus, iStatusLen;
962 int iBuf, iBufComm;
963 int ii, jj;
964 char *pcc;
965
966 int iVersionObjAttr = 0;
967 /* version no. of srawObjAttr:
968 =3: 288 byte cache buffer, 2 restore fields
969 =4: 304 byte, 5 restore fields, ATL server no.
970 =5: 384 byte, maior enhancement */
971 int iPoolId = 0;
972 int iObjLow = 0;
973 int iFS = 0;
974
975 srawComm *pComm;
976 srawQueryResult *pQuery;
977 srawObjAttr *pObjAttr;
978
979 pComm = pCommBuf;
980 iAction = ntohl(pComm->iAction);
981 iATLServer = ntohl(pComm->iATLServer);
982 pQuery = (srawQueryResult *) (*pQueryBuf);
983
984 iBufComm = ntohl(pComm->iCommLen) + HEAD_LEN;
985 if (iDebug) fprintf(fLogFile,
986 "\n-D- begin %s: query file %s in ATL Server %d (action %d)\n",
987 cModule, pComm->cNamell, iATLServer, iAction);
988
989 switch(iAction)
990 {
991 case QUERY:
992 case QUERY_ARCHIVE:
996 case QUERY_REMOVE:
997 case QUERY_REMOVE_MGR:
998 case QUERY_RETRIEVE:
1000 case QUERY_STAGE:
1001 ; /* okay */
1002 break;
1003 default:
1004 fprintf(fLogFile,
1005 "-E- %s: invalid action %d\n", cModule, iAction);
1006 iQuery = -1;
1007 goto gEndQueryFile;
1008 }
1009
1010 pcc = (char *) pComm;
1011 iRC = send(iSocket, pcc, (unsigned) iBufComm, 0);
1012 if (iRC < iBufComm)
1013 {
1014 if (iRC < 0) fprintf(fLogFile,
1015 "-E- %s: sending command buffer for query file %s\n",
1016 cModule, pComm->cNamell);
1017 else fprintf(fLogFile,
1018 "-E- %s: query command buffer incompletely sent (%d of %d byte)\n",
1019 cModule, iRC, iBufComm);
1020
1021 if (errno)
1022 {
1023 fprintf(fLogFile, " %s\n", strerror(errno));
1024 errno = 0;
1025 }
1026
1027 iQuery = -1;
1028 goto gEndQueryFile;
1029 }
1030
1031 if (iDebug) fprintf(fLogFile,
1032 " query command sent to entry server (%d bytes), look for reply\n",
1033 iBufComm);
1034
1035 /******************* look for reply from server *******************/
1036
1037gNextReply:
1038 pcc = (char *) pQuery;
1039 iRC = rawRecvHead(iSocket, pcc);
1040 if (iRC <= 0)
1041 {
1042 fprintf(fLogFile,
1043 "-E- %s: receiving buffer header with query information\n",
1044 cModule);
1045 iQuery = -1;
1046 goto gEndQueryFile;
1047 }
1048
1049 pcc += HEAD_LEN;
1050 iIdent = ntohl(pQuery->iIdent);
1051 iQuery = ntohl(pQuery->iObjCount);
1052 iAttrLen = ntohl(pQuery->iAttrLen);
1053
1054 if (iDebug) fprintf(fLogFile,
1055 " %d bytes received: iIdent %d, iQuery %d, iAttrLen %d\n",
1056 iRC, iIdent, iQuery, iAttrLen);
1057
1058 if ( (iIdent != IDENT_QUERY) && (iIdent != IDENT_QUERY_DONE) &&
1059 (iIdent != IDENT_QUERY_ARCHDB) )
1060 {
1061 iStatus = iQuery;
1062 iQuery = -1; /* query failed */
1063
1064 if (iIdent == IDENT_STATUS)
1065 {
1066 iStatusLen = iAttrLen;
1067 if ( (iStatus == STA_ERROR) || (iStatus == STA_ERROR_EOF) ||
1068 (iStatus == STA_ARCHIVE_NOT_AVAIL) ||
1069 (iStatus == STA_NO_ACCESS) )
1070 {
1071 if ( (iStatus == STA_ERROR) || (iStatus == STA_ERROR_EOF) )
1072 fprintf(fLogFile,
1073 "-E- %s: error status from entry server instead of query data:\n",
1074 cModule);
1075
1076 if (iStatusLen > 0)
1077 {
1078 iRC = rawRecvError(iSocket, iStatusLen, pcc);
1079 if (iRC < 0) fprintf(fLogFile,
1080 "-E- receiving error msg from server, rc = %d\n",
1081 iRC);
1082 else if ( (iDebug) || (iStatus == STA_ERROR) ||
1083 (iStatus == STA_ERROR_EOF) )
1084 fprintf(fLogFile, "%s", pcc);
1085 }
1086 else
1087 fprintf(fLogFile," no error message available\n");
1088
1089 if (iStatus == STA_ARCHIVE_NOT_AVAIL)
1090 iQuery = -1000;
1091 else if (iStatus == STA_NO_ACCESS)
1092 iQuery = -1001;
1093
1094 } /* (iStatus == STA_ERROR || STA_ERROR_EOF ||
1095 STA_ARCHIVE_NOT_AVAIL || STA_NO_ACCESS) */
1096 else fprintf(fLogFile,
1097 "-E- %s: unexpected status (type %d) received from server\n",
1098 cModule, iStatus);
1099
1100 } /* iIdent == IDENT_STATUS */
1101 else fprintf(fLogFile,
1102 "-E- %s: unexpected header (type %d) received from server\n",
1103 cModule, iIdent);
1104
1105 iQueryAll = iQuery;
1106 goto gEndQueryFile;
1107
1108 } /* iIdent != IDENT_QUERY && != IDENT_QUERY_DONE &&
1109 != IDENT_QUERY_ARCHDB */
1110
1111 iQueryAll += iQuery;
1112 if (iQuery > 0)
1113 {
1114 pcc = (char *) pQuery + HEAD_LEN;
1115 pObjAttr = (srawObjAttr *) pcc;
1116
1117 /* DDD iQuery = 1 only! */
1118 for (ii=1; ii<=iQuery; ii++)
1119 {
1120 iBuf = iAttrLen; /* only space for one object buffer */
1121 while(iBuf > 0)
1122 {
1123 if ( (iRC = recv( iSocket, pcc, (unsigned) iBuf, 0 )) <= 0 )
1124 {
1125 if (iRC < 0)
1126 {
1127 fprintf(fLogFile,
1128 "-E- %s: receiving buffer %d with query results\n",
1129 cModule, ii);
1130
1131 iQuery = -1;
1132 iQueryAll -= iQuery;
1133 }
1134 else
1135 {
1136 jj = iAttrLen - iBuf;
1137 fprintf(fLogFile,
1138 "-E- %s: connection to server broken, only %d bytes of query object %d (%d byte) received\n",
1139 cModule, jj, ii, iAttrLen);
1140
1141 if (ii == 1)
1142 {
1143 iQuery = -1;
1144 iQueryAll -= iQuery;
1145 }
1146 else
1147 {
1148 fprintf(fLogFile,
1149 "-E- %s: only %d of %d objects received\n",
1150 cModule, --ii, iQuery);
1151 iQueryAll -= iQuery - ii;
1152 iQuery = ii;
1153 }
1154 }
1155
1156 if (errno)
1157 {
1158 fprintf(fLogFile, " %s\n", strerror(errno));
1159 errno = 0;
1160 }
1161
1162 goto gEndQueryFile;
1163 }
1164
1165 iBuf -= iRC;
1166 pcc += iRC;
1167
1168 } /* while(iBuf > 0) */
1169
1170 iVersionObjAttr = ntohl(pObjAttr->iVersion);
1171 if ( (iVersionObjAttr != VERSION_SRAWOBJATTR) &&
1172 (iVersionObjAttr != VERSION_SRAWOBJATTR-1) )
1173 {
1174 fprintf(fLogFile,
1175 "-E- %s: invalid cacheDB entry version %d\n",
1176 cModule, iVersionObjAttr);
1177
1178 iQuery = -1;
1179 goto gEndQueryFile;
1180 }
1181
1182 iPoolId = ntohl(pObjAttr->iPoolId);
1183 if (iDebug)
1184 {
1185 if (ii == 1) fprintf(fLogFile,
1186 " query buffer received (%d bytes, objAttr data V%d)\n",
1187 iAttrLen, iVersionObjAttr);
1188 else fprintf(fLogFile,
1189 " query buffer overlaid (%d bytes)\n", iAttrLen);
1190
1191 fprintf(fLogFile, " %s%s%s: poolId %d",
1192 pObjAttr->cNamefs, pObjAttr->cNamehl,
1193 pObjAttr->cNamell, iPoolId);
1194 if (iPoolId == 1)
1195 fprintf(fLogFile, " (RetrievePool)\n");
1196 else if (iPoolId == 2)
1197 fprintf(fLogFile, " (StagePool)\n");
1198 else if (iPoolId == 3)
1199 fprintf(fLogFile, " (ArchivePool)\n");
1200 else if (iPoolId == 4)
1201 fprintf(fLogFile, " (DAQPool)\n");
1202 else
1203 fprintf(fLogFile, " (TSM DB)\n");
1204 }
1205 } /* object loop */
1206 } /* (iQuery > 0) */
1207 else if ( (iQuery == 0) && (iDebug) )
1208 fprintf(fLogFile,
1209 " no more objects found in ATL server %d\n", iATLServer);
1210
1211 /* if object explicitly specified, stop query if found */
1212 if ( (strchr(pComm->cNamell, *pcStar) == NULL) &&
1213 (strchr(pComm->cNamell, *pcQM) == NULL) &&
1214 (strchr(pComm->cNamell, *pcPerc) == NULL) &&
1215 (strchr(pComm->cNamehl, *pcStar) == NULL) &&
1216 (strchr(pComm->cNamehl, *pcQM) == NULL) &&
1217 (strchr(pComm->cNamehl, *pcPerc) == NULL) )
1218 iNameWC = 0;
1219 else
1220 iNameWC = 1;
1221
1222 if ( (iNameWC == 0) && (iQuery > 0) ) /* fixed name, found */
1223 goto gEndQueryFile;
1224
1225 if ( (iIdent == IDENT_QUERY) || (iIdent == IDENT_QUERY_ARCHDB) )
1226 goto gNextReply;
1227
1228gEndQueryFile:
1229 switch (iQueryAll)
1230 {
1231 case 0:
1232 if (iDebug) fprintf(fLogFile,
1233 " no matching object %s in gStore found\n",
1234 pComm->cNamell);
1235 break;
1236 case 1:
1237 if (iDebug) fprintf(fLogFile,
1238 " file %s available in gStore\n", pComm->cNamell);
1239 break;
1240 case -1:
1241 fprintf(fLogFile,
1242 "-E- %s: query in gStore could not be executed\n",
1243 cModule);
1244 iQuery = -1;
1245 break;
1246 case -1000:
1247 if (iDebug) fprintf(fLogFile,
1248 " requested archive %s not existing in gStore\n",
1249 pComm->cNamefs);
1250 break;
1251 case -1001:
1252 if (iDebug) fprintf(fLogFile,
1253 " requested access to file %s not allowed\n",
1254 pComm->cNamell);
1255 break;
1256 default:
1257 if (iQueryAll > 1)
1258 {
1259 if (strcmp(pComm->cOwner, "goeri") == 0)
1260 fprintf(fLogFile, "-W- %d versions of %s exist!\n",
1261 iQuery, pComm->cNamell);
1262 }
1263 else
1264 {
1265 fprintf(fLogFile,
1266 "-E- %s: invalid number %d of objects %s found\n",
1267 cModule, iQuery, pComm->cNamell);
1268 iQuery = -1;
1269 }
1270 } /* switch (iQuery) */
1271
1272 if (iDebug) fprintf(fLogFile,
1273 "-D- end %s\n\n", cModule);
1274
1275 return iQuery;
1276
1277} /* end rawQueryFile */
1278
1279/*********************************************************************/
1280/* rawRecvError: receive error message */
1281/* returns length of error message */
1282/* */
1283/* created 14. 3.96, Horst Goeringer */
1284/*********************************************************************/
1285
1286int rawRecvError(int iSocket, int iLen, char *pcMsg)
1287{
1288 char cModule[32]="rawRecvError";
1289 int iDebug = 0;
1290
1291 int iRC = 0, ii;
1292 int iBuf, iBufs;
1293 char *pcc;
1294
1295 if (iDebug)
1296 fprintf(fLogFile, "\n-D- begin %s\n", cModule);
1297
1298 strcpy(pcMsg, "");
1299 pcc = pcMsg; /* points now to buffer in calling procedure */
1300
1301 iBuf = iLen; /* length of error message */
1302 iBufs = iBuf;
1303 while(iBuf > 0)
1304 {
1305 if ( (iRC = recv(iSocket, pcc, (unsigned) iBuf, 0 )) <= 0 )
1306 {
1307 if (iRC < 0)
1308 {
1309 fprintf(fLogFile,
1310 "-E- %s: receiving error message\n", cModule);
1311
1312 if (errno)
1313 {
1314 fprintf(fLogFile, " %s\n", strerror(errno));
1315 errno = 0;
1316 }
1317
1318 iRC = -9;
1319 break;
1320 }
1321 else
1322 {
1323 ii = iLen - iBuf;
1324 if (ii) /* append delimiters after part of message received */
1325 {
1326 *pcc = '\0'; /* delimit message string */
1327 pcc++;
1328 *pcc = '\n';
1329 pcc++;
1330 if (iDebug) fprintf(fLogFile,
1331 "-E- incomplete error message received:\n %s", pcMsg);
1332 }
1333 fprintf(fLogFile,
1334 "-E- %s: connection to sender broken, %d byte of error message (%d byte) received\n",
1335 cModule, ii, iLen);
1336
1337 if (errno)
1338 {
1339 fprintf(fLogFile, " %s\n", strerror(errno));
1340 errno = 0;
1341 }
1342
1343 iRC = -8;
1344 break;
1345 }
1346 }
1347
1348 iBuf -= iRC;
1349 pcc += iRC;
1350
1351 } /* while(iBuf > 0) */
1352
1353 if (iBuf < 0)
1354 {
1355 fprintf(fLogFile,
1356 "-E- %s: more error data received than expected:\n %s",
1357 pcMsg, cModule);
1358 iRC = -2;
1359 }
1360
1361 if (iRC == -9)
1362 {
1363 if (iDebug)
1364 fprintf(fLogFile, "-D- end %s\n\n", cModule);
1365
1366 return iRC;
1367 }
1368 else
1369 {
1370 /* also okay if no message (iLen = 0) */
1371 *pcc = '\0'; /* delimit message string */
1372
1373 /* only msg part received */
1374 if (iRC == -8)
1375 iBufs = ii;
1376
1377 if (iDebug)
1378 {
1379 fprintf(fLogFile,
1380 " error message received (%d bytes):\n %s",
1381 iBufs, pcMsg);
1382 fprintf(fLogFile, "-D- end %s\n\n", cModule);
1383 }
1384
1385 return iBufs;
1386 }
1387
1388} /* rawRecvError */
1389
1390/*********************************************************************
1391 * rawRecvHead: receive common buffer header
1392 * returns no. of bytes received or error (< 0)
1393 *
1394 * created 5. 3.96, Horst Goeringer
1395 *********************************************************************
1396 */
1397
1398int rawRecvHead( int iSocket, char *pcBuf)
1399{
1400 char cModule[32]="rawRecvHead";
1401 int iDebug = 0;
1402
1403 int iBuf, iBufs;
1404 int iRC, ii;
1405 int iIdent;
1406 int iStatus;
1407 int iDataLen;
1408 char *pcc;
1409 int *pint;
1410
1411 if (iDebug)
1412 fprintf(fLogFile, "\n-D- begin %s\n", cModule);
1413
1414 strcpy(pcBuf, "");
1415 pcc = pcBuf; /* points now to buffer in calling procedure */
1416 pint = (int *) pcc;
1417
1418 iBuf = HEAD_LEN;
1419 iBufs = iBuf;
1420 while(iBuf > 0)
1421 {
1422 iRC = recv(iSocket, pcc, (unsigned) iBuf, 0);
1423 if (iRC <= 0)
1424 {
1425 if (iRC < 0) fprintf(fLogFile,
1426 "-E- %s: receiving buffer header\n", cModule);
1427 else
1428 {
1429 ii = iBufs - iBuf;
1430 fprintf(fLogFile,
1431 "-E- %s: connection to sender broken, %d byte of buffer header (%d byte) received\n",
1432 cModule, ii, iBufs);
1433 }
1434
1435 if (errno)
1436 {
1437 fprintf(fLogFile, " %s\n", strerror(errno));
1438 errno = 0;
1439 }
1440
1441 return -1;
1442 }
1443
1444 iBuf -= iRC;
1445 pcc += iRC;
1446
1447 } /* while(iBuf > 0) */
1448
1449 iIdent = ntohl(*pint);
1450 pint++;
1451 iStatus = ntohl(*pint);
1452 pint++;
1453 iDataLen = ntohl(*pint);
1454 if (iDebug) fprintf(fLogFile,
1455 " ident %d, status %d, datalen %d\n",
1456 iIdent, iStatus, iDataLen);
1457
1458 if ( (iIdent == IDENT_STATUS) &&
1459 ((iStatus == STA_ERROR) || (iStatus == STA_ERROR_EOF)) &&
1460 (iDataLen > 0) )
1461 {
1462 if (iDebug) fprintf(fLogFile,
1463 "-W- %s: error message available for receive (%d byte)\n",
1464 cModule, iDataLen);
1465 return iDataLen;
1466 }
1467
1468 if (iDebug) fprintf(fLogFile,
1469 "-D- end %s: buffer header received (%d bytes)\n\n",
1470 cModule, iBufs);
1471
1472 return iBufs;
1473
1474} /* rawRecvHead */
1475
1476/*********************************************************************
1477 * rawRecvHeadC: receive common buffer header and check
1478 * return values:
1479 * >= 0: no error occurred:
1480 * = HEAD_LEN: header received (and okay)
1481 * > HEAD_LEN: status message of this size in pcMsg
1482 * = 0: error status received, but no message
1483 *
1484 * < 0: error occurred:
1485 * = -1: recv failed
1486 * = -2: connection to sender lost
1487 * = -3: receiving error msg failed
1488 * = -4: unexpected identifier received
1489 * = -5: unexpected status received
1490 *
1491 * created 7. 3.2002, Horst Goeringer
1492 *********************************************************************
1493 */
1494
1495int rawRecvHeadC(int iSocket,
1496 char *pcBuf,
1497 int iIdentReq, /* < 0 => check, = 0 => no check */
1498 int iStatusReq, /* >= 0 => check, < 0 => no check */
1499 char *pcMsg)
1500{
1501 char cModule[32] = "rawRecvHeadC";
1502 int iDebug = 0;
1503
1504 /* header to be received */
1505 int iIdent;
1506 int iStatus;
1507 int iDataLen;
1508
1509 char cMsg1[STATUS_LEN] = "";
1510
1511 int iRC, ii;
1512 int iBuf, iBufs;
1513 char *pcc;
1514 int *pint;
1515
1516 if (iDebug)
1517 {
1518 fprintf(fLogFile, "\n-D- begin %s\n", cModule);
1519
1520 if (iIdentReq < 0) fprintf(fLogFile,
1521 " check Ident, expect %d\n", iIdentReq);
1522 else
1523 fprintf(fLogFile, " no check of Ident\n");
1524 if (iStatusReq >= 0) fprintf(fLogFile,
1525 " check Status, expect %d\n", iStatusReq);
1526 else
1527 fprintf(fLogFile, " no check of Status\n");
1528 }
1529
1530 strcpy(pcMsg, "");
1531 strcpy(pcBuf, "");
1532 pcc = pcBuf; /* points now to buffer in calling procedure */
1533
1534 iBuf = HEAD_LEN;
1535 iBufs = iBuf;
1536 while(iBuf > 0)
1537 {
1538 if ( (iRC = recv( iSocket, pcc, (unsigned) iBuf, 0 )) <= 0 )
1539 {
1540 if (iRC < 0)
1541 {
1542 sprintf(pcMsg, "-E- %s: receiving buffer header\n",
1543 cModule);
1544 iRC = -1;
1545 }
1546 else
1547 {
1548 ii = iBufs - iBuf;
1549 sprintf(pcMsg,
1550 "-E- %s: connection to sender broken, %d byte of buffer header (%d byte) received\n",
1551 cModule, ii, iBufs);
1552 iRC = -2;
1553 }
1554
1555 if (errno)
1556 {
1557 snprintf(cMsg1, sizeof(cMsg1), " %s\n", strerror(errno));
1558 strcat(pcMsg, cMsg1);
1559 errno = 0;
1560 }
1561
1562 if (iDebug)
1563 fprintf(fLogFile, "%s", pcMsg);
1564
1565 goto gEndRecvHeadC;
1566 }
1567
1568 iBuf -= iRC;
1569 pcc += iRC;
1570
1571 } /* while(iBuf > 0) */
1572
1573 if (iDebug) fprintf(fLogFile,
1574 " buffer header received (%d bytes)\n", iBufs);
1575
1576 pint = (int *) pcBuf;
1577 iIdent = ntohl(*pint);
1578 pint++;
1579 iStatus = ntohl(*pint);
1580 pint++;
1581 iDataLen = ntohl(*pint);
1582
1583 if (iDebug) fprintf(fLogFile,
1584 " ident %d, status %d, datalen %d\n",
1585 iIdent, iStatus, iDataLen);
1586
1587 if (iIdent == IDENT_STATUS)
1588 {
1589 if (iDebug)
1590 {
1591 fprintf(fLogFile, " status received");
1592 if ( (iDataLen) &&
1593 ((iStatus == STA_ERROR) || (iStatus == STA_ERROR_EOF)) )
1594 fprintf(fLogFile, " with error message\n");
1595 else
1596 fprintf(fLogFile, "\n");
1597 }
1598
1599 if ( (iDataLen) &&
1600 ((iStatus == STA_ERROR) || (iStatus == STA_ERROR_EOF) ||
1601 (iStatus == STA_CACHE_FULL)) )
1602 {
1603 pcc = cMsg1;
1604 iRC = rawRecvError(iSocket, iDataLen, pcc);
1605 if (iRC < 0)
1606 {
1607 sprintf(pcMsg, "-E- %s: receiving error msg, rc=%d\n",
1608 cModule, iRC);
1609 if (iDebug)
1610 fprintf(fLogFile, "%s", pcMsg);
1611
1612 iRC = -3;
1613 goto gEndRecvHeadC;
1614 }
1615
1616 if (iDebug) fprintf(fLogFile,
1617 " msg (%d byte): %s\n", iDataLen, pcc);
1618 strcat(pcMsg, pcc);
1619 iRC = strlen(pcMsg);
1620 goto gEndRecvHeadC;
1621 }
1622
1623 if ( (iDataLen == 0) &&
1624 ((iStatus == STA_ERROR) || (iStatus == STA_ERROR_EOF)) )
1625 {
1626 strcat(pcMsg,
1627 "-W- error status received, but no error message\n");
1628 iRC = 0;
1629 goto gEndRecvHeadC;
1630 }
1631 } /* (iIdent == IDENT_STATUS) */
1632
1633 if (iIdentReq < 0) /* test for expected identifier, values < 0 */
1634 {
1635 if (iDebug)
1636 fprintf(fLogFile, " check identifier\n");
1637
1638 if (iIdent != iIdentReq)
1639 {
1640 sprintf(pcMsg,
1641 "-E- %s: unexpected header (ident %d) received\n",
1642 cModule, iIdent);
1643 if (iDebug)
1644 fprintf(fLogFile, "%s", pcMsg);
1645
1646 iRC = -4;
1647 goto gEndRecvHeadC;
1648
1649 } /* unexpected ident) */
1650 else
1651 {
1652 if (iStatusReq >= 0) /* test for expected status */
1653 {
1654 if (iDebug)
1655 fprintf(fLogFile, " check status\n");
1656
1657 if (iStatusReq != iStatus)
1658 {
1659 sprintf(pcMsg,
1660 "-E- %s: unexpected header (status %d) received\n",
1661 cModule, iStatus);
1662 if (iDebug)
1663 fprintf(fLogFile, "%s", pcMsg);
1664
1665 iRC = -5;
1666 goto gEndRecvHeadC;
1667 }
1668 }
1669 } /* expected ident */
1670 } /* check ident requested */
1671
1672 iRC = HEAD_LEN;
1673
1674gEndRecvHeadC:
1675 if (iDebug)
1676 fprintf(fLogFile, "-D- end %s\n\n", cModule);
1677
1678 return iRC;
1679
1680} /* rawRecvHeadC */
1681
1682/*********************************************************************
1683 * rawRecvRequest:
1684 * receive request for next buffer and convert to host format
1685 * returns 0: request received
1686 * 2: EOF status received
1687 * 3: EOS status received
1688 * 4, 5: error status received
1689 * < 0: error occured
1690 *
1691 * created 21.12.2000, Horst Goeringer
1692 *********************************************************************
1693 */
1694
1695int rawRecvRequest(int iSocket,
1696 int *piSeekMode,
1697 int *piOffset,
1698 int *piBufferSize)
1699{
1700 char cModule[32]="rawRecvRequest";
1701 int iDebug = 0;
1702
1703 int iRC;
1704 int iError = 0;
1705 int iRequSize = sizeof(srawRequest);
1706 int iBuf, iBuf0;
1707 int ii, iimax;
1708 char *pcc;
1709 char cMsg[STATUS_LEN] = ""; /* error msg received */
1710
1711 srawRequest sRequest, *pRequest;
1712
1713 if (iDebug) fprintf(fLogFile,
1714 "\n-D- begin %s: receive request buffer\n", cModule);
1715
1716 pRequest = &sRequest;
1717 pcc = (char *) pRequest;
1718 iBuf = HEAD_LEN;
1719 iimax = HEAD_LEN;
1720 while(iBuf > 0)
1721 {
1722 if ( (iRC = recv( iSocket, pcc, (unsigned) iBuf, 0 )) <= 0 )
1723 {
1724 if (iRC < 0)
1725 {
1726 fprintf(fLogFile,
1727 "-E- %s: receiving buffer header\n", cModule);
1728 iError = -1;
1729 }
1730 else
1731 {
1732 ii = iimax - iBuf;
1733 fprintf(fLogFile,
1734 "-W- %s: connection to sender broken, %d byte of buffer header (%d byte) received\n",
1735 cModule, ii, iimax);
1736 iError = -5;
1737 }
1738
1739 goto gErrorRecvRequest;
1740 }
1741
1742 iBuf -= iRC;
1743 pcc += iRC;
1744
1745 } /* while(iBuf > 0) */
1746
1747 if (iBuf < 0)
1748 {
1749 fprintf(fLogFile,
1750 "-E- %s: more buffer header data received than expected\n",
1751 cModule);
1752
1753 iError = -2;
1754 goto gErrorRecvRequest;
1755 }
1756
1757 pRequest->iIdent = ntohl(pRequest->iIdent);
1758 if (iDebug) fprintf(fLogFile,
1759 " buffer header received (%d bytes, id %d)\n",
1760 iimax, pRequest->iIdent);
1761
1762 if ( (pRequest->iIdent != IDENT_NEXT_BUFFER) &&
1763 (pRequest->iIdent != IDENT_STATUS) )
1764 {
1765 fprintf(fLogFile, "-E- %s: invalid buffer received (id %d)\n",
1766 cModule, pRequest->iIdent);
1767 iError = -3;
1768 goto gErrorRecvRequest;
1769 }
1770
1771 pRequest->iStatus = ntohl(pRequest->iStatus);
1772 pRequest->iStatusLen = ntohl(pRequest->iStatusLen);
1773 iBuf0 = pRequest->iStatusLen;
1774 iBuf = iBuf0;
1775 if (pRequest->iIdent != IDENT_NEXT_BUFFER)
1776 pcc = cMsg; /* more space needed */
1777
1778 while(iBuf > 0)
1779 {
1780 if ( (iRC = recv( iSocket, pcc, (unsigned) iBuf, 0 )) <= 0 )
1781 {
1782 if (iRC < 0)
1783 {
1784 fprintf(fLogFile,
1785 "-E- %s: receiving buffer data\n", cModule);
1786 iError = -1;
1787 }
1788 else
1789 {
1790 ii = iBuf0 - iBuf;
1791 fprintf(fLogFile,
1792 "-W- %s: connection to sender broken, %d byte of data (%d byte) received\n",
1793 cModule, ii, iBuf0);
1794 iError = -5;
1795 }
1796
1797 if (errno)
1798 {
1799 fprintf(fLogFile, " %s\n", strerror(errno));
1800 errno = 0;
1801 }
1802
1803 goto gErrorRecvRequest;
1804 }
1805
1806 iBuf -= iRC;
1807 pcc += iRC;
1808
1809 } /* while(iBuf > 0) */
1810
1811 if (iBuf < 0)
1812 {
1813 fprintf(fLogFile, "-E- %s: more data received than expected\n",
1814 cModule);
1815 iError = -2;
1816 goto gErrorRecvRequest;
1817 }
1818
1819 if (pRequest->iIdent == IDENT_NEXT_BUFFER)
1820 {
1821 if (iDebug) fprintf(fLogFile,
1822 " %s: request data received (%d bytes)\n", cModule, iBuf0);
1823
1824 if (iBuf0 + HEAD_LEN != iRequSize)
1825 {
1826 fprintf(fLogFile,
1827 "-E- %s: invalid data size (%d) in request buffer (expected %d byte)\n",
1828 cModule, iBuf0, iRequSize-HEAD_LEN);
1829 iError = -4;
1830 goto gErrorRecvRequest;
1831 }
1832
1833 *piSeekMode = ntohl(pRequest->iSeekMode);
1834 *piOffset = ntohl(pRequest->iOffset);
1835 *piBufferSize = ntohl(pRequest->iBufferSize);
1836
1837 if (iDebug)
1838 fprintf(fLogFile, "-D- end %s\n\n", cModule);
1839
1840 return 0;
1841
1842 } /* (pRequest->iIdent == IDENT_NEXT_BUFFER) */
1843 else if (pRequest->iIdent == IDENT_STATUS)
1844 {
1845 if ( (pRequest->iStatus == STA_END_OF_FILE) ||
1846 (pRequest->iStatus == STA_END_OF_SESSION) )
1847 {
1848 if (iDebug) fprintf(fLogFile,
1849 " %s: status info received: end session\n", cModule);
1850 }
1851 else if ( (pRequest->iStatus == STA_ERROR) ||
1852 (pRequest->iStatus == STA_ERROR_EOF) )
1853
1854 {
1855 if (iDebug) fprintf(fLogFile,
1856 "-W- %s: error status received: end session\n", cModule);
1857 if (iBuf0 > 0) fprintf(fLogFile,
1858 "-W- %s: error message from client:\n %s\n",
1859 cModule, cMsg);
1860 iError = -4;
1861 goto gErrorRecvRequest;
1862 }
1863 else
1864 {
1865 fprintf(fLogFile,
1866 "-E- %s: invalid status buffer received (id %d)\n",
1867 cModule, pRequest->iStatus);
1868 iError = -3;
1869 goto gErrorRecvRequest;
1870 }
1871
1872 iError = pRequest->iStatus;
1873 goto gErrorRecvRequest;
1874
1875 } /* (pRequest->iIdent == IDENT_STATUS) */
1876 else
1877 {
1878 fprintf(fLogFile, "-E- %s: invalid buffer received (ident %d)\n",
1879 cModule, pRequest->iIdent);
1880 iError = -2;
1881 goto gErrorRecvRequest;
1882 }
1883
1884gErrorRecvRequest:
1885 if (iDebug)
1886 fprintf(fLogFile, "-D- end %s\n\n", cModule);
1887
1888 if (iError)
1889 return iError;
1890
1891 return 0;
1892
1893} /* rawRecvRequest */
1894
1895/*********************************************************************
1896 * rawRecvStatus: receive status header
1897 * returns no. of bytes received or error (< 0)
1898 * status header will be converted to host format
1899 *
1900 * created 18. 3.96, Horst Goeringer
1901 *********************************************************************
1902 */
1903
1904int rawRecvStatus( int iSocket, char *pcBuf)
1905{
1906 char cModule[32]="rawRecvStatus";
1907 int iDebug = 0;
1908
1909 int iRC, ii;
1910 int iBuf, iBufs;
1911 int iLen;
1912 char *pcc;
1913 srawStatus *pStatus;
1914
1915 if (iDebug)
1916 fprintf(fLogFile, "\n-D- begin %s\n", cModule);
1917
1918 pcc = pcBuf; /* points now to buffer in calling procedure */
1919 pStatus = (srawStatus *) pcc;
1920 memset(pcc, 0x00, sizeof(HEAD_LEN));
1921 iBuf = HEAD_LEN;
1922 iBufs = iBuf;
1923
1924 while(iBuf > 0)
1925 {
1926 if ( (iRC = recv( iSocket, pcc, (unsigned) iBuf, 0 )) <= 0 )
1927 {
1928 if (iRC < 0) fprintf(fLogFile,
1929 "-E- %s: receiving status header\n", cModule);
1930 else
1931 {
1932 ii = iBufs - iBuf;
1933 fprintf(fLogFile,
1934 "-E- %s: connection to sender broken, %d byte of status header (%d byte) received\n",
1935 cModule, ii, iBufs);
1936 }
1937
1938 if (errno)
1939 {
1940 fprintf(fLogFile, " %s\n", strerror(errno));
1941 errno = 0;
1942 }
1943
1944 return -1;
1945 }
1946
1947 iBuf -= iRC;
1948 pcc += iRC;
1949
1950 } /* while(iBuf > 0) */
1951
1952 if (iBuf < 0)
1953 {
1954 fprintf(fLogFile,
1955 "-E- %s: more status header data received than expected\n",
1956 cModule);
1957 return -2;
1958 }
1959
1960 pStatus->iIdent = ntohl(pStatus->iIdent);
1961 pStatus->iStatus = ntohl(pStatus->iStatus);
1962 pStatus->iStatusLen = ntohl(pStatus->iStatusLen);
1963
1964 if (iDebug)
1965 {
1966 fprintf(fLogFile, " status header received (%d bytes)\n",
1967 iBufs);
1968 fprintf(fLogFile, " ident %d, status %d, status len %d\n",
1969 pStatus->iIdent, pStatus->iStatus, pStatus->iStatusLen);
1970 }
1971
1972 if (pStatus->iIdent != IDENT_STATUS)
1973 {
1974 fprintf(fLogFile, "-E- %s: invalid status header received (%d)\n",
1975 cModule, pStatus->iIdent);
1976 return -3;
1977 }
1978
1979 iLen = pStatus->iStatusLen;
1980 if (iLen > 0)
1981 {
1982 memset(pcc, 0x00, (unsigned) iLen);
1983 iBuf = iLen; /* length of status message */
1984 iBufs += iBuf;
1985 while(iBuf > 0)
1986 {
1987 if ( (iRC = recv( iSocket, pcc, (unsigned) iBuf, 0 )) <= 0 )
1988 {
1989 if (iRC < 0) fprintf(fLogFile,
1990 "-E- %s: receiving status message\n", cModule);
1991 else
1992 {
1993 ii = iLen - iBuf;
1994 fprintf(fLogFile,
1995 "-E- %s: connection to sender broken, %d byte of status message (%d byte) received\n",
1996 cModule, ii, iLen);
1997 }
1998
1999 if (errno)
2000 {
2001 fprintf(fLogFile, " %s\n", strerror(errno));
2002 errno = 0;
2003 }
2004
2005 return -4;
2006 }
2007
2008 iBuf -= iRC;
2009 pcc += iRC;
2010
2011 } /* while(iBuf > 0) */
2012
2013 if (iBuf < 0)
2014 {
2015 fprintf(fLogFile,
2016 "-E- %s: more status data received than expected\n",
2017 cModule);
2018 return -5;
2019 }
2020
2021 if (iDebug) fprintf(fLogFile,
2022 " status message received (%d bytes):\n%s\n",
2023 iLen, pStatus->cStatus);
2024
2025 } /* iLen > 0 */
2026
2027 if (iDebug)
2028 fprintf(fLogFile, "-D- end %s\n\n", cModule);
2029
2030 return iBufs;
2031
2032} /* rawRecvStatus */
2033
2034/*********************************************************************
2035 * rawSendRequest: send request buffer
2036 * returns 0 or error (< 0)
2037 * status header will be converted to net format
2038 *
2039 * created 21.12.2000, Horst Goeringer
2040 *********************************************************************
2041 */
2042
2043int rawSendRequest(int iSocket,
2044 int iSeekMode,
2045 int iOffset,
2046 int iBufferSize)
2047{
2048 char cModule[32]="rawSendRequest";
2049 int iDebug = 0;
2050
2051 int iBuf, iRC;
2052 char *pcc;
2053
2054 srawRequest sRequest;
2055 int iRequSize = sizeof(srawRequest);
2056
2057 if (iDebug) fprintf(fLogFile,
2058 "\n-D- begin %s: send request buffer\n", cModule);
2059
2060 sRequest.iIdent = htonl((unsigned int) IDENT_NEXT_BUFFER);
2061 if (iSeekMode < 0)
2062 sRequest.iStatus = htonl(STA_NEXT_BUFFER);
2063 else
2064 sRequest.iStatus = htonl(STA_SEEK_BUFFER);
2065 sRequest.iStatusLen = htonl(iRequSize - HEAD_LEN);
2066
2067 sRequest.iSeekMode = htonl(iSeekMode);
2068 sRequest.iOffset = htonl(iOffset);
2069 if (iBufferSize < 0)
2070 {
2071 fprintf(fLogFile,
2072 "-E- %s: invalid buffer size %d\n", cModule, iBufferSize);
2073 return -1;
2074 }
2075 sRequest.iBufferSize = htonl(iBufferSize);
2076
2077 iBuf = iRequSize;
2078 pcc = (char *) &sRequest;
2079 iRC = send(iSocket, pcc, (unsigned) iBuf, 0);
2080 if (iRC < iBuf)
2081 {
2082 if (iRC < 0) fprintf(fLogFile,
2083 "-E- %s: sending request buffer\n", cModule);
2084 else fprintf(fLogFile,
2085 "-E- %s: request buffer incompletely sent (%d of %d byte)\n",
2086 cModule, iRC, iBuf);
2087
2088 if (errno)
2089 {
2090 fprintf(fLogFile, " %s\n", strerror(errno));
2091 errno = 0;
2092 }
2093
2094 return -1;
2095 }
2096
2097 if (iDebug) fprintf(fLogFile,
2098 "-D- end %s: request buffer sent\n\n", cModule);
2099
2100 return 0;
2101
2102} /* rawSendRequest */
2103
2104/*********************************************************************
2105 * rawSendStatus: send status buffer
2106 * returns no. of bytes sent or error (< 0)
2107 * status header will be converted to net format
2108 *
2109 * created 5. 3.96, Horst Goeringer
2110 *********************************************************************
2111 */
2112
2113int rawSendStatus( int iSocket, int iStatus, char *pcMsg)
2114{
2115 char cModule[32]="rawSendStatus";
2116 int iDebug = 0;
2117
2118 int iBuf = HEAD_LEN;
2119 int iRC, iMsgLen;
2120 char *pcc;
2121 srawStatus sStatus;
2122
2123 if (iDebug) fprintf(fLogFile,
2124 "\n-D- begin %s: send status buffer (%d) to socket %d\n",
2125 cModule, iStatus, iSocket);
2126
2127 sStatus.iIdent = htonl((unsigned int) IDENT_STATUS);
2128 sStatus.iStatus = htonl(iStatus);
2129 sStatus.iStatusLen = htonl(0);
2130
2131 if (pcMsg == NULL)
2132 iMsgLen = 0;
2133 else
2134 iMsgLen = strlen(pcMsg);
2135 if (iMsgLen)
2136 {
2137 iBuf += iMsgLen;
2138 sStatus.iStatusLen = htonl(iMsgLen);
2139 strcpy(sStatus.cStatus, pcMsg);
2140 if (iDebug) fprintf(fLogFile,
2141 " %s: error message (%d bytes):\n %s\n",
2142 cModule, iMsgLen, pcMsg);
2143 }
2144
2145 pcc = (char *) &sStatus;
2146 if (iDebug)
2147 {
2148 fprintf(fLogFile,
2149 " now send (iIdent %d, iStatus %d, iStatusLen %d), %d byte:\n",
2150 ntohl(sStatus.iIdent), ntohl(sStatus.iStatus),
2151 ntohl(sStatus.iStatusLen), iBuf);
2152 fflush(fLogFile);
2153 }
2154
2155 iRC = send(iSocket, pcc, (unsigned) iBuf, 0);
2156 if (iRC < iBuf)
2157 {
2158 if (iRC < 0) fprintf(fLogFile,
2159 "-E- %s: sending status buffer\n", cModule);
2160 else fprintf(fLogFile,
2161 "-E- %s: status buffer incompletely sent (%d of %d byte)\n",
2162 cModule, iRC, iBuf);
2163
2164 if (errno)
2165 {
2166 fprintf(fLogFile, " %s\n", strerror(errno));
2167 errno = 0;
2168 }
2169
2170 return -1;
2171 }
2172
2173 if (iDebug) fprintf(fLogFile,
2174 "-D- end %s: status buffer sent (%d byte)\n\n", cModule, iBuf);
2175
2176 return(iBuf);
2177
2178} /* rawSendStatus */
2179
2180/*********************************************************************
2181 * rawTestFileName:
2182 * verify that specified name is a valid file name
2183 * and has no wildcards
2184 * created 15.3.1996, Horst Goeringer
2185 *********************************************************************
2186 */
2187
2188int rawTestFileName( char *pcFile)
2189{
2190 char cModule[32] = "rawTestFileName";
2191 int iDebug = 0;
2192
2193 int iRC;
2194 int ilen;
2195 int iError = 0;
2196 unsigned long lFileSize = 0; /* dummy for rawGetFileSize */
2197 unsigned int iSize = 0; /* dummy for rawGetFileSize */
2198 char *pdir;
2199
2200 if (iDebug) fprintf(fLogFile,
2201 "-D- begin %s: input file name %s\n", cModule, pcFile);
2202
2203 if ( (pdir = strrchr(pcFile, '*')) != NULL)
2204 {
2205 fprintf(fLogFile,
2206 "-E- invalid file name '%s': '*' not allowed as part of file name\n",
2207 pcFile);
2208 iError = 3;
2209 goto gErrorTest;
2210 }
2211
2212 if ( (pdir = strrchr(pcFile, '?')) != NULL)
2213 {
2214 fprintf(fLogFile,
2215 "-E- invalid file name '%s': '?' not allowed as part of file name\n",
2216 pcFile);
2217 iError = 3;
2218 goto gErrorTest;
2219 }
2220
2221 if ( (pdir = strrchr(pcFile, '/')) == NULL)
2222 {
2223 if (iDebug)
2224 fprintf(fLogFile, " name %s okay\n", pcFile);
2225 }
2226 else /* name contains '/' */
2227 {
2228 ilen = strlen(pdir);
2229 if (iDebug) fprintf(fLogFile,
2230 " trailor %s (len %d)\n", pdir, ilen);
2231 if (ilen == 1)
2232 {
2233 strncpy(pdir, "\0", 1);
2234 if (iDebug)
2235 fprintf(fLogFile, " %s is a directory\n", pcFile);
2236 iError = 2;
2237 goto gErrorTest;
2238 }
2239 else if (iDebug)
2240 fprintf(fLogFile, " rel name %s okay\n", pcFile);
2241 }
2242
2243 iRC = rawGetFileSize(pcFile, &lFileSize, &iSize);
2244 if (iDebug) fprintf(fLogFile,
2245 " after rawGetFileSize, rc = %d\n", iRC);
2246
2247 if (iRC)
2248 {
2249 if (iDebug)
2250 {
2251 fprintf(fLogFile, "-W- %s NOT archived", pcFile);
2252 if (iRC == 1)
2253 fprintf(fLogFile, " - is a directory\n");
2254 else if (iRC == 2)
2255 fprintf(fLogFile, " - is a symbolic link\n");
2256 else if (iRC == 3)
2257 fprintf(fLogFile, " - is not a regular file\n");
2258 else
2259 fprintf(fLogFile, "\n");
2260 }
2261
2262 iError = 2;
2263 goto gErrorTest;
2264 }
2265
2266 if (iDebug) fprintf(fLogFile,
2267 " %s is a regular file\n", pcFile);
2268
2269gErrorTest:
2270 if (iDebug)
2271 fprintf(fLogFile, "-D- end %s\n\n", cModule);
2272
2273 return iError;
2274
2275} /* rawTestFileName */
2276
static char cPath[MAX_FULL_FILE]
int rawTestFileName(char *pcFile)
Definition rawProcn.c:2188
int rawAddStrings(char *pcMsg1, int iMaxLength1, char *pcMsg2, int iMaxLength2, int iErrno, char *pcMsgE, int iMaxLengthE)
Definition rawProcn.c:180
int rawRecvError(int iSocket, int iLen, char *pcMsg)
Definition rawProcn.c:1286
int rawRecvStatus(int iSocket, char *pcBuf)
Definition rawProcn.c:1904
int rawCheckClientFile(char *pcFile0, char **pcFile, char **pcTape)
Definition rawProcn.c:345
int rawRecvHeadC(int iSocket, char *pcBuf, int iIdentReq, int iStatusReq, char *pcMsg)
Definition rawProcn.c:1495
int rawRecvRequest(int iSocket, int *piSeekMode, int *piOffset, int *piBufferSize)
Definition rawProcn.c:1695
static char cNamefs[MAX_OBJ_FS]
Definition rawProcn.c:166
int rawRecvHead(int iSocket, char *pcBuf)
Definition rawProcn.c:1398
int rawSendStatus(int iSocket, int iStatus, char *pcMsg)
Definition rawProcn.c:2113
int rawSendRequest(int iSocket, int iSeekMode, int iOffset, int iBufferSize)
Definition rawProcn.c:2043
int rawGetFileSize(char *pcFile, unsigned long *piSize, unsigned int *piRecl)
Definition rawProcn.c:787
char * rawGetHLName(char *pcPath)
Definition rawProcn.c:657
static char * pcNull
Definition rawProcn.c:168
int rawQueryFile(int iSocket, int iAltMaster, srawComm *pCommBuf, void **pQueryBuf)
Definition rawProcn.c:946
char * rawGetPathName(char *pcNamehl)
Definition rawProcn.c:901
int rawGetLLName(char *pcFile, const char *pcDelimiter, char *pcObject)
Definition rawProcn.c:736
char * rawGetFSpName(char *pcUser)
Definition rawProcn.c:600
static char cNamehl[MAX_OBJ_HL]
Definition rawProcn.c:167
static int iObjAttr
Definition rawapin.c:202
FILE * fLogFile
Definition rawapin.c:185
static int iATLServer
Definition rawapin.c:214
bool_t
Definition rawapitd.h:29
@ bFalse
Definition rawapitd.h:30
@ bTrue
Definition rawapitd.h:31
#define IDENT_QUERY
Definition rawcommn.h:291
@ STA_NEXT_BUFFER
Definition rawcommn.h:442
@ STA_ARCHIVE_NOT_AVAIL
Definition rawcommn.h:458
@ STA_SEEK_BUFFER
Definition rawcommn.h:449
@ STA_ERROR_EOF
Definition rawcommn.h:446
@ STA_END_OF_FILE
Definition rawcommn.h:443
@ STA_NO_ACCESS
Definition rawcommn.h:459
@ STA_END_OF_SESSION
Definition rawcommn.h:444
@ STA_CACHE_FULL
Definition rawcommn.h:455
@ STA_ERROR
Definition rawcommn.h:445
#define MAX_FULL_FILE
Definition rawcommn.h:255
#define IDENT_STATUS
Definition rawcommn.h:290
#define IDENT_QUERY_ARCHDB
Definition rawcommn.h:302
#define MAX_OBJ_LL
Definition rawcommn.h:266
#define VERSION_SRAWOBJATTR
Definition rawcommn.h:259
#define HEAD_LEN
Definition rawcommn.h:283
#define MAX_OBJ_HL
Definition rawcommn.h:265
#define STATUS_LEN
Definition rawcommn.h:284
#define IDENT_QUERY_DONE
Definition rawcommn.h:307
#define MAX_OBJ_FS
Definition rawcommn.h:263
#define IDENT_NEXT_BUFFER
Definition rawcommn.h:294
@ QUERY
Definition rawcommn.h:351
@ QUERY_REMOVE
Definition rawcommn.h:354
@ QUERY_RETRIEVE_RECORD
Definition rawcommn.h:371
@ QUERY_REMOVE_MGR
Definition rawcommn.h:355
@ QUERY_STAGE
Definition rawcommn.h:364
@ QUERY_ARCHIVE
Definition rawcommn.h:352
@ QUERY_ARCHIVE_TO_CACHE
Definition rawcommn.h:369
@ QUERY_ARCHIVE_MGR
Definition rawcommn.h:353
@ QUERY_RETRIEVE
Definition rawcommn.h:367
@ QUERY_ARCHIVE_RECORD
Definition rawcommn.h:374
#define MAX_TAPE_FILE
Definition rawcommn.h:257
static const char * pcQM
Definition rawdefn.h:65
static const char * pcDevDelim
Definition rawdefn.h:31
static const char * pcPerc
Definition rawdefn.h:66
static const char * pcStar
Definition rawdefn.h:64
char cNamefs[MAX_OBJ_FS]
Definition rawcommn.h:401
int iATLServer
Definition rawcommn.h:422
char cOwner[MAX_OWNER]
Definition rawcommn.h:404
char cNamehl[MAX_OBJ_HL]
Definition rawcommn.h:402
char cNamell[MAX_OBJ_LL]
Definition rawcommn.h:403
int iAction
Definition rawcommn.h:399
int iCommLen
Definition rawcommn.h:400
char cNamefs[MAX_OBJ_FS]
Definition rawcommn.h:522
char cNamehl[MAX_OBJ_HL]
Definition rawcommn.h:523
char cNamell[MAX_OBJ_LL]
Definition rawcommn.h:524
int iBufferSize
Definition rawcommn.h:486
int iSeekMode
Definition rawcommn.h:481
int iStatusLen
Definition rawcommn.h:480
int iStatus
Definition rawcommn.h:471
int iStatusLen
Definition rawcommn.h:472
char cStatus[STATUS_LEN]
Definition rawcommn.h:473