vms.c
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:6k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /*
  2.  * File vms.c - assorted bletcherous hacks for VMS.
  3.    Written by Eric Youngdale (1993).
  4.  */
  5. static char rcsid[] ="$Id: vms.c,v 1.2 1997/02/23 16:06:20 eric Rel $";
  6. #ifdef VMS
  7. #include <rms.h>
  8. #include <descrip.h>
  9. #include <ssdef.h>
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12. #define opendir fake_opendir
  13. #include "mkisofs.h"
  14. #undef opendir
  15. #include <stdio.h>
  16. static struct RAB *rab; /* used for external mailfiles */
  17. static int rms_status;
  18. static error_exit(char * text){
  19. fprintf(stderr,"%sn", text);
  20. exit(33);
  21. }
  22. char * strrchr(const char *, char);
  23. char * strdup(char * source){
  24.   char * pnt;
  25.   pnt = (char *) e_malloc(strlen(source) + 1);
  26.   strcpy(pnt, source);
  27.   return pnt;
  28. }
  29. int VMS_stat(char * path, struct stat * spnt){
  30.   char * spath;
  31.   char sbuffer[255];
  32.   char * pnt, *ppnt;
  33.   char * pnt1;
  34.   ppnt = strrchr(path,']');
  35.   if(ppnt) ppnt++;
  36.   else ppnt = path;
  37.   spath = path;
  38.   if(strcmp(ppnt,".") == 0 || strcmp(ppnt,"..") == 0){
  39.     strcpy(sbuffer, path);
  40.     /* Find end of actual name */
  41.     pnt = strrchr(sbuffer,']');
  42.     if(!pnt) return 0;
  43.     pnt1 = pnt;
  44.     while(*pnt1 != '[' && *pnt1 != '.') pnt1--;
  45.     if(*pnt1 != '[' && strcmp(ppnt,"..") == 0) {
  46.       pnt1--;
  47.       while(*pnt1 != '[' && *pnt1 != '.') pnt1--;
  48.     };
  49.     if(*pnt1 == '.') {
  50.       *pnt1 = ']';
  51.       pnt = pnt1;
  52.       while(*pnt != '.' && *pnt != ']') pnt++;
  53.       *pnt++ = ']';
  54.       while(*pnt != '.' && *pnt != ']') pnt++;
  55.       *pnt = 0;
  56.       strcat(sbuffer,".DIR;1");
  57.     };
  58.     if(*pnt1 == '[') {
  59.       pnt1++;
  60.       *pnt1 = 0;
  61.       strcat(pnt1,"000000]");
  62.       pnt1 = strrchr(path,'[') + 1;
  63.       pnt = sbuffer + strlen(sbuffer);
  64.       while(*pnt1 && *pnt1 != '.' && *pnt1 != ']') *pnt++ = *pnt1++;
  65.       *pnt = 0;
  66.       strcat(sbuffer,".DIR;1");
  67.     };
  68.     spath = sbuffer;
  69.   };
  70.   return stat_filter(spath, spnt);
  71. }
  72. static int dircontext[32] = {0,};
  73. static char * searchpath[32];
  74. static struct direct d_entry[32];
  75. int optind = 0;
  76. char * optarg;
  77. int  getopt(int argc, char *argv[], char * flags){
  78.   char * pnt;
  79.   char c;
  80.   optind++;
  81.   if(*argv[optind] != '-') return EOF;
  82.   optarg = 0;
  83.   c = *(argv[optind]+1);
  84.   pnt = (char *) strchr(flags, c);
  85.   if(!pnt) return c;  /* Not found */
  86.   if(pnt[1] == ':') {
  87.     optind++;
  88.     optarg = argv[optind];
  89.   };
  90.   return c;
  91. }
  92. void vms_path_fixup(char * name){
  93.   char * pnt1;
  94.   pnt1 = name + strlen(name) - 6;
  95.   /* First strip the .DIR;1 */
  96.   if(strcmp(pnt1, ".DIR;1") == 0) *pnt1 = 0;
  97.   pnt1 = (char*) strrchr(name, ']');
  98.   if(pnt1) {
  99.     if(pnt1[1] == 0) return;
  100.     *pnt1 = '.';
  101.     strcat(name,"]");
  102.     return;
  103.   };
  104.   pnt1 = (char*) strrchr(name, '>');
  105.   if(pnt1) {
  106.     if(pnt1[1] == 0) return;
  107.     *pnt1 = '.';
  108.     strcat(name,">");
  109.     return;
  110.   };
  111. }
  112. int opendir(char * path){
  113.   int i;
  114.   for(i=1; i<32; i++) {
  115.     if(dircontext[i] == 0){
  116.       dircontext[i] = -1;
  117.       searchpath[i] = (char *) e_malloc(strlen(path) + 6);
  118.       strcpy(searchpath[i], path);
  119.       vms_path_fixup(searchpath[i]);
  120.       strcat(searchpath[i],"*.*.*");
  121.       return i;
  122.     };
  123.   };
  124.   exit(0);
  125. }
  126. struct direct * readdir(int context){
  127.   int i;
  128.   char cresult[100];
  129.   char * pnt;
  130.   int status;
  131.   $DESCRIPTOR(dpath,searchpath[context]);
  132.   $DESCRIPTOR(result,cresult);
  133.   if(dircontext[context] == -1) {
  134.     dircontext[context] = -2;
  135.     strcpy(d_entry[context].d_name, ".");
  136.     return &d_entry[context];
  137.   };
  138.   if(dircontext[context] == -2) {
  139.     dircontext[context] = -3;
  140.     strcpy(d_entry[context].d_name, "..");
  141.     return &d_entry[context];
  142.   };
  143.   if(dircontext[context] == -3) dircontext[context] = 0;
  144.   dpath.dsc$w_length = strlen(searchpath[context]);
  145.   lib$find_file(&dpath, &result, &dircontext[context], 
  146. 0, 0, &status, 0);
  147.   if(status == SS$_NOMOREFILES) return 0;
  148.   /* Now trim trailing spaces from the name */
  149.   i = result.dsc$w_length - 1;
  150.   while(i && cresult[i] == ' ') i--;
  151.   cresult[i+1] = 0;
  152.   /* Now locate the actual portion of the file we want */
  153.   pnt = (char *) strrchr(cresult,']');
  154.   if(pnt) pnt++;
  155.   else
  156.     pnt = cresult;
  157.   strcpy(d_entry[context].d_name, pnt);
  158.   return &d_entry[context];
  159. }
  160. void closedir(int context){
  161.   lib$find_file_end(&dircontext[context]);
  162.   free(searchpath[context]);
  163.   searchpath[context] = (char *) 0;
  164.   dircontext[context] = 0;
  165. }
  166. static open_file(char* fn){
  167. /* this routine initializes a rab and  fab required to get the
  168.    correct definition of the external data file used by mail */
  169. struct FAB * fab;
  170. rab = (struct RAB*) e_malloc(sizeof(struct RAB));
  171. fab = (struct FAB*) e_malloc(sizeof(struct FAB));
  172. *rab = cc$rms_rab; /* initialize RAB*/
  173. rab->rab$l_fab = fab;
  174. *fab = cc$rms_fab; /* initialize FAB*/
  175. fab->fab$l_fna = fn;
  176. fab->fab$b_fns = strlen(fn);
  177. fab->fab$w_mrs = 512;
  178. fab->fab$b_fac = FAB$M_BIO | FAB$M_GET;
  179. fab->fab$b_org = FAB$C_SEQ;
  180. fab->fab$b_rfm = FAB$C_FIX;
  181. fab->fab$l_xab = (char*) 0;
  182. rms_status = sys$open(rab->rab$l_fab);
  183. if(rms_status != RMS$_NORMAL && rms_status != RMS$_CREATED)
  184. error_exit("$OPEN");
  185. rms_status = sys$connect(rab);
  186. if(rms_status != RMS$_NORMAL)
  187. error_exit("$CONNECT");
  188. return 1;
  189. }
  190. static close_file(struct RAB * prab){
  191. rms_status = sys$close(prab->rab$l_fab);
  192. free(prab->rab$l_fab);
  193. free(prab);
  194. if(rms_status != RMS$_NORMAL)
  195. error_exit("$CLOSE");
  196. }
  197. #define NSECT 16
  198. extern unsigned int last_extent_written;
  199. int vms_write_one_file(char * filename, int size, FILE * outfile){
  200. int status, i;
  201. char buffer[SECTOR_SIZE * NSECT];
  202. int count;
  203. int use;
  204. int remain;
  205. open_file(filename);
  206. remain = size;
  207. while(remain > 0){
  208.   use =  (remain >  SECTOR_SIZE * NSECT - 1 ? NSECT*SECTOR_SIZE : remain);
  209.   use = ROUND_UP(use); /* Round up to nearest sector boundary */
  210.   memset(buffer, 0, use);
  211.   rab->rab$l_ubf = buffer;
  212.   rab->rab$w_usz = sizeof(buffer);
  213.   status = sys$read(rab);
  214.   fwrite(buffer, 1, use, outfile);
  215.   last_extent_written += use/SECTOR_SIZE;
  216.   if((last_extent_written % 1000) < use/SECTOR_SIZE) fprintf(stderr,"%d..", last_extent_written);
  217.   remain -= use;
  218. };
  219. close_file(rab);
  220. }
  221. #endif