Example #1
0
int do_move(const char *filename,uint64_t lv,uint32_t ts,char *ptr) {
	uint32_t inode,parent_src,parent_dst;
	uint8_t name_src[256],name_dst[256];
	EAT(ptr,filename,lv,'(');
	GETU32(parent_src,ptr);
	EAT(ptr,filename,lv,',');
	GETNAME(name_src,ptr,filename,lv,',');
	EAT(ptr,filename,lv,',');
	GETU32(parent_dst,ptr);
	EAT(ptr,filename,lv,',');
	GETNAME(name_dst,ptr,filename,lv,')');
	EAT(ptr,filename,lv,')');
	EAT(ptr,filename,lv,':');
	GETU32(inode,ptr);
	return fs_log_move(ts,parent_src,strlen((char*)name_src),name_src,parent_dst,strlen((char*)name_dst),name_dst,inode);
}
Example #2
0
/*
 *	init_mach_macros(void)
 *
 *	Set the magic macros TARGET_MACH, HOST_MACH,
 *
 *	Parameters:
 *
 *	Global variables used:
 * 	                        host_mach   Property for magic macro HOST_MACH
 * 	                        target_mach Property for magic macro TARGET_MACH
 *
 *	Return value:
 *				The function does not return a value, but can
 *				call fatal() in case of error.
 */
static void
init_mach_macros(void)
{
	FILE *pipe;
	name_t *value;
	const char *mach_command = NOCATGETS("/bin/mach");
	string_t str;
	wchar_t buf[STRING_BUFFER_LENGTH];
	char fgetsbuf[100];
	boolean_t set_host = B_FALSE, set_target = B_FALSE;
	name_t *host_mach, *target_mach;

	/*
	 * Skip out if we've already done this:
	 */
	if (init_mach_done == B_TRUE)
		return;
	init_mach_done = B_TRUE;

	host_mach = _internal_get_magic_macro(MMI_HOST_MACH);
	target_mach = _internal_get_magic_macro(MMI_TARGET_MACH);

	/*
	 * If both have been set already, don't proceed any further:
	 */
	if (set_host == B_FALSE && set_target == B_FALSE)
		return;

	if (get_prop(host_mach->n_prop, PT_MACRO) == NULL)
		set_host = B_TRUE;
	if (get_prop(target_mach->n_prop, PT_MACRO) == NULL)
		set_target = B_TRUE;

	INIT_STRING_FROM_STACK(str, buf);
	append_char(L'-', &str);

	if ((pipe = popen(mach_command, "r")) == NULL) {
		fatal_mksh(catgets(libmksdmsi18n_catd, 1, 183,
		    "Execute of %s failed"), mach_command);
	}
	while (fgets(fgetsbuf, sizeof (fgetsbuf), pipe) != NULL)
		append_string(fgetsbuf, &str, FIND_LENGTH);
	if (pclose(pipe) != 0) {
		fatal_mksh(catgets(libmksdmsi18n_catd, 1, 184, "Execute of %s "
		    "failed"), mach_command);
	}

	value = GETNAME(str.str_buf_start, FIND_LENGTH);
	if (set_host == B_TRUE) {
		(void) setvar_daemon(host_mach, value, B_FALSE,
		    DN_NO_DAEMON, B_TRUE, 0);
	}
	if (set_target == B_TRUE) {
		(void) setvar_daemon(target_mach, value, B_FALSE,
		    DN_NO_DAEMON, B_TRUE, 0);
	}
}
Example #3
0
uint8_t do_unlink(uint64_t lv,uint32_t ts,char *ptr) {
        uint32_t inode,parent;
        uint8_t name[256];
        EAT(ptr,lv,'(');
        GETU32(parent,ptr);
        EAT(ptr,lv,',');
        GETNAME(name,ptr,lv,')');
        EAT(ptr,lv,')');
        EAT(ptr,lv,':');
        GETU32(inode,ptr);
        return shadow_fs_unlink(ts,parent,strlen((char*)name),name,inode);
}
Example #4
0
int do_unlink(const char *filename,uint64_t lv,uint32_t ts,char *ptr) {
	uint32_t inode,parent;
	uint8_t name[256];
	EAT(ptr,filename,lv,'(');
	GETU32(parent,ptr);
	EAT(ptr,filename,lv,',');
	GETNAME(name,ptr,filename,lv,')');
	EAT(ptr,filename,lv,')');
	EAT(ptr,filename,lv,':');
	GETU32(inode,ptr);
	return fs_log_unlink(ts,parent,strlen((char*)name),name,inode);
}
Example #5
0
int do_snapshot(const char *filename,uint64_t lv,uint32_t ts,char *ptr) {
	uint32_t inode,parent,canoverwrite;
	uint8_t name[256];
	EAT(ptr,filename,lv,'(');
	GETU32(inode,ptr);
	EAT(ptr,filename,lv,',');
	GETU32(parent,ptr);
	EAT(ptr,filename,lv,',');
	GETNAME(name,ptr,filename,lv,',');
	EAT(ptr,filename,lv,',');
	GETU32(canoverwrite,ptr);
	EAT(ptr,filename,lv,')');
	return fs_log_snapshot(ts,inode,parent,strlen((char*)name),name,canoverwrite);
}
Example #6
0
int do_setxattr(const char *filename,uint64_t lv,uint32_t ts,char *ptr) {
	uint32_t inode,valueleng,mode;
	uint8_t name[256];
	static uint8_t *value = NULL;
	static uint32_t valuesize = 0;
	EAT(ptr,filename,lv,'(');
	GETU32(inode,ptr);
	EAT(ptr,filename,lv,',');
	GETNAME(name,ptr,filename,lv,',');
	EAT(ptr,filename,lv,',');
	GETDATA(value,valueleng,valuesize,ptr,filename,lv,',');
	EAT(ptr,filename,lv,',');
	GETU32(mode,ptr);
	EAT(ptr,filename,lv,')');
	return fs_log_setxattr(ts,inode,strlen((char*)name),name,valueleng,value,mode);
}
                		/* the rest of the pattern segments */
#endif /* ANSI_PROTOTYPES */
{
    char *saved_end = path_end;	/* saved to be resored */
    char *pat;			/* current pattern segment */
    struct stat st;		/* to check if file exists */

#ifdef GLOBDEBUG
    ffprintf(STDDBG,"do_glob: path = '%s', pat = '%s'\n", main_path, *gpat );
#endif

    for ( ; (pat = *gpat) != 0 && no_glob(pat); gpat++ )
    {
#ifdef GLOBDEBUG
	ffprintf(STDDBG,"no_glob: path = '%s', pat = '%s'\n", main_path, pat );
#endif
	*path_end = '/';
	(void)strcpy(path_end+1, pat);
	path_end += strlen(pat) + 1;

	if (GLOBSTAT(main_path, &st) != 0 )
	{
	    *saved_end = '\0';
	    return;
	}
    }
    if (pat)
	matchdir(path_end, gpat);
    else
	add_name();

    *saved_end = '\0';
    return;
}

static void
#ifndef ANSI_PROTOTYPES
matchdir(path_end, gpat)
    char *path_end;		/* ptr to end of main_path */
    char **gpat;		/* the rest of the pattern segments */
#else /* ANSI_PROTOTYPES */
matchdir(char *path_end, char **gpat)
                   		/* ptr to end of main_path */
                		/* the rest of the pattern segments */
#endif /* ANSI_PROTOTYPES */
{
    char *x;			/* scratch */
    VOIDDIR *dirp;		/* for directory reading */
    VOIDDIRENT *dp;		/* directory entry */
    struct stat st;		/* to determine files type */

#ifdef GLOBDEBUG
    ffprintf(STDDBG,"matchdir: path = '%s', pat = '%s'\n", main_path, *gpat );
#endif
    if ((dirp = OPENDIR(main_path)) == NULL)
	return;

    *path_end = '/';

    while ((dp = READDIR(dirp)) != NULL)
    {
	char *dirname;
	x = dirname = GETNAME(dp);	/* was dp->d_name */
	if (*x == '.' && (*++x == '\0' || (*x == '.' && *++x == '\0')))
	    continue;
	if (*dirname == '.' && **gpat != '.')
	    continue;

	(void)strcpy(path_end + 1, dirname);

	if (glob_match(*gpat, dirname))
	{   /* this is a match */
	    if ( *(gpat+1) == 0 )
	    {	/* and it is the last */
		add_name();	/* so eat it */
		continue;
	    }
	    if (GLOBSTAT(main_path, &st) == 0 /* else not the last */
		&& (st.st_mode & S_IFMT) == S_IFDIR)
		do_glob(path_end + strlen(dirname) + 1, gpat + 1);
	} 
    }

    (void)CLOSEDIR(dirp);

    *path_end = '\0';
}
Example #8
0
uint8_t do_symlink(uint64_t lv,uint32_t ts,char *ptr) {
        uint32_t parent,uid,gid,inode;
        uint8_t name[256];
        static uint8_t *path;
        static uint32_t pathsize;
        EAT(ptr,lv,'(');
        GETU32(parent,ptr);
        EAT(ptr,lv,',');
        GETNAME(name,ptr,lv,',');
        EAT(ptr,lv,',');
        GETPATH(path,pathsize,ptr,lv,',');
        EAT(ptr,lv,',');
        GETU32(uid,ptr);
        EAT(ptr,lv,',');
        GETU32(gid,ptr);
        EAT(ptr,lv,')');
        EAT(ptr,lv,':');
        GETU32(inode,ptr);
        return shadow_fs_symlink(ts,parent,strlen((char*)name),name,path,uid,gid,inode);
}
Example #9
0
int do_symlink(const char *filename,uint64_t lv,uint32_t ts,char *ptr) {
	uint32_t parent,uid,gid,inode;
	uint8_t name[256];
	static uint8_t *path = NULL;
	static uint32_t pathsize = 0;
	EAT(ptr,filename,lv,'(');
	GETU32(parent,ptr);
	EAT(ptr,filename,lv,',');
	GETNAME(name,ptr,filename,lv,',');
	EAT(ptr,filename,lv,',');
	GETPATH(path,pathsize,ptr,filename,lv,',');
	EAT(ptr,filename,lv,',');
	GETU32(uid,ptr);
	EAT(ptr,filename,lv,',');
	GETU32(gid,ptr);
	EAT(ptr,filename,lv,')');
	EAT(ptr,filename,lv,':');
	GETU32(inode,ptr);
	return fs_log_symlink(ts,parent,strlen((char*)name),name,path,uid,gid,inode);
}
Example #10
0
static name_t *
_internal_get_magic_macro(magic_macro_id_t id)
{
	if (id == MMI_UNKNOWN || id >= _MMI_MAX_ID) {
		fprintf(stderr, "PROGRAMMING ERROR\n");
		/*
		 * XXX
		 */
		abort();
	}

	if (magic_macros[id - 1] == NULL) {
		/*
		 * Internalise the name:
		 */
		magic_macros[id - 1] = GETNAME(macro_names[id - 1],
		    FIND_LENGTH);
	}

	return (magic_macros[id - 1]);
}
Example #11
0
/*
 *	getvar(name)
 *
 *	Return expanded value of macro.
 *
 *	Return value:
 *				The expanded value of the macro
 *
 *	Parameters:
 *		name		The name of the macro we want the value for
 *
 *	Global variables used:
 */
name_t *
getvar(name_t *name)
{
	string_t dest;
	wchar_t buf[STRING_BUFFER_LENGTH];
	name_t *result;
	property_t *prop;
	macro_t *macro;

	INIT_STRING_FROM_STACK(dest, buf);

	prop = maybe_append_prop(name, PT_MACRO);
	if (prop->p_type != PT_MACRO)
		abort();
	macro = (macro_t *)prop->p_body;
	expand_value(macro->m_value, &dest, B_FALSE);

	result = GETNAME(dest.str_buf_start, FIND_LENGTH);
	if (dest.str_free_after_use)
		free(dest.str_buf_start);

	return (result);
}
Example #12
0
int do_create(const char *filename,uint64_t lv,uint32_t ts,char *ptr) {
	uint32_t parent,mode,uid,gid,rdev,inode;
	uint8_t type,name[256];
	EAT(ptr,filename,lv,'(');
	GETU32(parent,ptr);
	EAT(ptr,filename,lv,',');
	GETNAME(name,ptr,filename,lv,',');
	EAT(ptr,filename,lv,',');
	type = *ptr;
	ptr++;
	EAT(ptr,filename,lv,',');
	GETU32(mode,ptr);
	EAT(ptr,filename,lv,',');
	GETU32(uid,ptr);
	EAT(ptr,filename,lv,',');
	GETU32(gid,ptr);
	EAT(ptr,filename,lv,',');
	GETU32(rdev,ptr);
	EAT(ptr,filename,lv,')');
	EAT(ptr,filename,lv,':');
	GETU32(inode,ptr);
	return fs_log_create(ts,parent,strlen((char*)name),name,type,mode,uid,gid,rdev,inode);
}
Example #13
0
char* specialForm(Obj expr) { return GETNAME(CAR(expr)); }
Example #14
0
bool isQuit(Obj expr) {
	return GETTAG(expr) == NAME &&
		cmpForm(GETNAME(expr), QUIT_COMMAND);
}
Example #15
0
static void
_process_macro_name(string_t *str, string_t *dest, boolean_t cmd)
{
	const wchar_t *colon_sh = L":sh";
	const wchar_t *colon_shell = L":shell";
	extraction_type_t extraction = EXT_NO;
	name_t *name = NULL;
	wchar_t *colon, *percent;
	replacement_t rpl;
	int i;

	bzero(&rpl, sizeof (rpl));

	/*
	 * First, check if we have a $(@D) type translation.
	 */
	if ((get_char_semantics_value(str->str_buf_start[0]) &
	    CHC_SPECIAL_MACRO) != 0) {
		switch (str->str_buf_start[1]) {
		case L'D':
			extraction = EXT_DIR;
			break;
		case L'F':
			extraction = EXT_FILE;
			break;
		default:
			fatal_reader_mksh(catgets(libmksdmsi18n_catd, 1, 119,
			    "Illegal macro reference `%ls'"),
			    str->str_buf_start);
		}
		/*
		 * Internalise the macro name using the first character
		 * only:
		 */
		name = GETNAME(str->str_buf_start, 1);
		/*
		 * XXX this seems slightly dodge:
		 */
		(void) wcscpy(str->str_buf_start, str->str_buf_start + 2);
	}

	/*
	 * Check for other kinds of translations.
	 */
	if ((colon = wcschr(str->str_buf_start, L':')) != NULL) {
		/*
		 * We have a $(FOO:.c=.o) type translation.
		 * Get the name of the macro proper.
		 */
		if (name == NULL) {
			name = GETNAME(str->str_buf_start,
			    colon - str->str_buf_start);
		}
		/*
		 * Pickup all the translations.
		 */
		if (wcscmp(colon, colon_sh) == 0 || wcscmp(colon,
		    colon_shell) == 0) {
			rpl.rpl_type = RT_SHELL;
		} else if (svr4 == B_TRUE || (percent = wcschr(colon + 1,
		    L'%')) == NULL) {
			/*
			 * Straight substition -- .c=.o
			 */
			_parse_straight_subst(colon, &rpl);
		} else {
			/*
			 * Percent-style substition -- op%os=np%ns
			 */
			_parse_percent_subst(colon, &rpl);
		}
	}

	if (name == NULL) {
		/*
		 * No translations found.
		 * Use the whole string as the macro name.
		 */
		name = GETNAME(str->str_buf_start, str->str_p -
		    str->str_buf_start);
	}

	/*
	 * Take note of any special macro considerations:
	 */
	if (is_magic_macro_name(MMI_MAKE, name) == B_TRUE) {
		make_word_mentioned = B_TRUE;
	}
	if (is_magic_macro_name(MMI_QUERY, name) == B_TRUE) {
		query_mentioned = B_TRUE;
	}
	if (is_magic_macro_name(MMI_HOST_ARCH, name) == B_TRUE ||
	    is_magic_macro_name(MMI_TARGET_ARCH, name) == B_TRUE) {
		init_arch_macros();
	}
	if (is_magic_macro_name(MMI_HOST_MACH, name) == B_TRUE ||
	    is_magic_macro_name(MMI_TARGET_MACH, name) == B_TRUE) {
		init_mach_macros();
	}

	_get_macro_value(name, dest, &rpl, extraction, cmd);

	free(rpl.rpl_left_head);
	free(rpl.rpl_left_tail);
	free(rpl.rpl_right_head);
	free(rpl.rpl_right_tail);
	for (i = 0; rpl.rpl_right_hand[i] != NULL; i++)
		free(rpl.rpl_right_hand[i]);
}
Example #16
0
int main (int argc, char *argv[])
{
  FILE *fopen(), *fpin;
  char *infile, *outbase, *outext, *filter;
  char *ppa, *ppb;
  char **pending_name;
  int *pending_number;
  int i, r;
  int verbose_flag;
  int begin_frame,max_frames;
  int pp_flag;
  int outtype;

  infile = NULL;
  outbase = NULL;
  outext = NULL;
  verbose_flag = 0;
  filter = NULL;
  begin_frame=1;
  max_frames=-1;
  outtype = PPM_RAW;

  /* scan arguments */

  pp_flag = 0;
  pending_number = NULL;
  pending_name = NULL;
  ppa = ppb = NULL;

  if (argc == 1)
    { print_usage(); exit(1); }

  for (i=1; i < argc; i++)
    {
      ppa=argv[i];
      if (pp_flag == 1)
        { SCANINT(ppa, pending_number); pp_flag = 0; }
      else if (pp_flag == 2)
        { *pending_name = ppa; pp_flag = 0; }
      else if (*ppa == '-')
	{
	  ppb = (ppa++);
	  switch (*ppa)
	    {
	    case 'b':   GETNUMBER(begin_frame); break;
	    case 'n':   GETNUMBER(max_frames); break;
	    case 'a':   outtype = PPM_ASCII; break;
	    case 'm':   outtype = FBM_MAPPED; break;
	    case 'f':   GETNAME(filter); break;
	    case 'v':   verbose_flag = 1; break;
	    case 'h':   print_usage(); print_help(); exit(1);
	    default:
	      fprintf(stderr,"Illegal option '%c' in argument %d\n",
		      *ppa,i);
	      print_hint();
	      exit(1);
	    }
	}
      else  if (infile == NULL)
	{
	  infile=argv[i];
	}
      else if (outbase == NULL)
	{
	  outbase=argv[i];
	}
      else if (outext == NULL)
	{
	  outext=argv[i];
	}
      else
	{
	  fprintf(stderr,"Too many parameters specified\n");
	  print_hint();
	  exit(1);
	}
    }

  if (pp_flag == 1)
    {
      fprintf(stderr,"Missing number behind option '%c'\n",*ppb);
      print_hint();
      exit(1);
    }

  if (outbase == NULL)
    {
      print_usage();
      exit(1);
    }

  /* fprintf(stderr,"Open Input File\n"); */
  if ((fpin = fopen(infile, "rb")) == NULL)
    {
      fprintf(stderr,"Error opening input file '%s'\n",infile);
      exit(1);
    }

  r = unfli(fpin,outbase,outext,outtype,
	    begin_frame,max_frames,verbose_flag,filter);

  if (r == 0)
    fprintf(stderr,"Stop\n");
  else if (r == 1)
    fprintf(stderr,"Ready\n");
  else if (r == -1)
    fprintf(stderr,"Read error\n");
  else if (r == -2)
    fprintf(stderr,"Error allocating memory\n");
  else
    fprintf(stderr,"Unknown error\n");

  fclose(fpin);

  return(0);
}
Example #17
0
char* specialForm(Obj expr) {
	// return GETLIST(expr)->car.val.name;
	return GETNAME(CAR(GETLIST(expr)));
}