#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "kernel.h"
#include "swis.h"
#include "flex.h"

#include "main.h"
#include "msgtrans.h"
#include "path.h"

// find out if a given path is writeable
// by enquiring about the FS status

int path_readonly(char *filename)
{
  // get FS information block
  int *fscb;
  char *prefix=NULL;
  char *fullname;
  int size;
  _kernel_oserror *e;

  if (*(filename+strlen(filename)-1)=='.') {
    if (!flex_alloc((flex_ptr)&prefix,strlen(filename))) {
      msgtrans_error("NoMem");
      return 1;
    }
    strncpy(prefix,filename,strlen(filename)-1);
    *(prefix+strlen(filename)-1)=0;
  }

  e=_swix(OS_FSControl,_INR(0,5)|_OUT(5),37,prefix?prefix:filename,NULL,0,0,0,&size);
  if (e) {
    if (prefix) flex_free((flex_ptr)&prefix);
    error(e,FALSE);
    return 1;
  }
  
  if (!flex_alloc((flex_ptr)&fullname,1-size)) {
    if (prefix) flex_free((flex_ptr)&prefix);
    msgtrans_error("NoMem");
    return 1;
  }

  e=_swix(OS_FSControl,_INR(0,5),37,prefix?prefix:filename,fullname,0,0,1-size);
  if (prefix) flex_free((flex_ptr)&prefix);
  if (e) {
    flex_free((flex_ptr)&fullname);
    error(e,FALSE);
    return 1;
  }

  e=_swix(OS_FSControl,_INR(0,2)|_OUT(2),13,fullname,0,&fscb);
  flex_free((flex_ptr)&fullname);
  if (e) {
    error(e,FALSE);
    return 1;
  }
  
  return (*(fscb+8) & (1<<16))!=0; // test readonly flag
}
