Exemple #1
0
/*
 * Dynamically allocate space for a struct item plus the key and data
 * elements.  If name is non-NULL it is used as the key, else the
 * gid is the key.  Fills in datum from struct group.
 */
struct cache_item *
make_gritem(const struct group *gr, const char *name)
{
    char *cp;
    size_t nsize, psize, nmem, total, len;
    struct cache_item *item;
    struct group *newgr;

    /* Allocate in one big chunk for easy freeing. */
    nsize = psize = nmem = 0;
    total = sizeof(struct cache_item) + sizeof(struct group);
    FIELD_SIZE(gr, gr_name, nsize);
    FIELD_SIZE(gr, gr_passwd, psize);
    if (gr->gr_mem) {
	for (nmem = 0; gr->gr_mem[nmem] != NULL; nmem++)
	    total += strlen(gr->gr_mem[nmem]) + 1;
	nmem++;
	total += sizeof(char *) * nmem;
    }
    if (name != NULL)
	total += strlen(name) + 1;

    if ((item = malloc(total)) == NULL)
	    return NULL;
    cp = (char *) item + sizeof(struct cache_item);

    /*
     * Copy in group contents and make strings relative to space
     * at the end of the buffer.  Note that gr_mem must come
     * immediately after struct group to guarantee proper alignment.
     */
    newgr = (struct group *)cp;
    memcpy(newgr, gr, sizeof(struct group));
    cp += sizeof(struct group);
    if (gr->gr_mem) {
	newgr->gr_mem = (char **)cp;
	cp += sizeof(char *) * nmem;
	for (nmem = 0; gr->gr_mem[nmem] != NULL; nmem++) {
	    len = strlen(gr->gr_mem[nmem]) + 1;
	    memcpy(cp, gr->gr_mem[nmem], len);
	    newgr->gr_mem[nmem] = cp;
	    cp += len;
	}
	newgr->gr_mem[nmem] = NULL;
    }
    FIELD_COPY(gr, newgr, gr_passwd, psize);
    FIELD_COPY(gr, newgr, gr_name, nsize);

    /* Set key and datum. */
    if (name != NULL) {
	memcpy(cp, name, strlen(name) + 1);
	item->k.name = cp;
    } else {
	item->k.gid = gr->gr_gid;
    }
    item->d.gr = newgr;
    item->refcnt = 1;

    return item;
}
Exemple #2
0
LOCAL cl_int
cl_get_image_info(cl_mem mem,
                  cl_image_info param_name,
                  size_t param_value_size,
                  void *param_value,
                  size_t *param_value_size_ret)
{
  int err;
  CHECK_IMAGE(mem, image);

  switch(param_name)
  {
    FIELD_SIZE(IMAGE_FORMAT, cl_image_format);
    FIELD_SIZE(IMAGE_ELEMENT_SIZE, size_t);
    FIELD_SIZE(IMAGE_ROW_PITCH, size_t);
    FIELD_SIZE(IMAGE_SLICE_PITCH, size_t);
    FIELD_SIZE(IMAGE_WIDTH, size_t);
    FIELD_SIZE(IMAGE_HEIGHT, size_t);
    FIELD_SIZE(IMAGE_DEPTH, size_t);
  default:
    return CL_INVALID_VALUE;
  }

  switch(param_name)
  {
  case CL_IMAGE_FORMAT:
    *(cl_image_format *)param_value = image->fmt;
    break;
  case CL_IMAGE_ELEMENT_SIZE:
    *(size_t *)param_value = image->bpp;
    break;
  case CL_IMAGE_ROW_PITCH:
    *(size_t *)param_value = image->row_pitch;
    break;
  case CL_IMAGE_SLICE_PITCH:
    *(size_t *)param_value = image->slice_pitch;
    break;
  case CL_IMAGE_WIDTH:
    *(size_t *)param_value = image->w;
    break;
  case CL_IMAGE_HEIGHT:
    *(size_t *)param_value = image->h;
    break;
  case CL_IMAGE_DEPTH:
    *(size_t *)param_value = image->depth;
    break;
  }

  return CL_SUCCESS;

error:
    return err;
}
Exemple #3
0
LOCAL cl_int
cl_get_mem_object_info(cl_mem mem,
                cl_mem_info param_name,
                size_t param_value_size,
                void *param_value,
                size_t *param_value_size_ret)
{
  switch(param_name)
  {
    FIELD_SIZE(MEM_TYPE, cl_mem_object_type);
    FIELD_SIZE(MEM_FLAGS, cl_mem_flags);
    FIELD_SIZE(MEM_SIZE, size_t);
    FIELD_SIZE(MEM_HOST_PTR, void *);
    FIELD_SIZE(MEM_MAP_COUNT, cl_uint);
    FIELD_SIZE(MEM_REFERENCE_COUNT, cl_uint);
    FIELD_SIZE(MEM_CONTEXT, cl_context);
    FIELD_SIZE(MEM_ASSOCIATED_MEMOBJECT, cl_mem);
    FIELD_SIZE(MEM_OFFSET, size_t);
  default:
    return CL_INVALID_VALUE;
  }

  switch(param_name)
  {
  case CL_MEM_TYPE:
    *((cl_mem_object_type *)param_value) = cl_get_mem_object_type(mem);
    break;
  case CL_MEM_FLAGS:
    *((cl_mem_flags *)param_value) = mem->flags;
    break;
  case CL_MEM_SIZE:
    *((size_t *)param_value) = mem->size;
    break;
  case CL_MEM_HOST_PTR:
    *((size_t *)param_value) = (size_t)mem->host_ptr;
    break;
  case CL_MEM_MAP_COUNT:
    *((cl_uint *)param_value) = mem->map_ref;
    break;
  case CL_MEM_REFERENCE_COUNT:
    *((cl_uint *)param_value) = mem->ref_n;
    break;
  case CL_MEM_CONTEXT:
    *((cl_context *)param_value) = mem->ctx;
    break;
  case CL_MEM_ASSOCIATED_MEMOBJECT:
    if(mem->type != CL_MEM_SUBBUFFER_TYPE) {
      *((cl_mem *)param_value) = NULL;
    } else {
      struct _cl_mem_buffer* buf = (struct _cl_mem_buffer*)mem;
      *((cl_mem *)param_value) = (cl_mem)(buf->parent);
    }
    break;
  case CL_MEM_OFFSET:
    if(mem->type != CL_MEM_SUBBUFFER_TYPE) {
      *((size_t *)param_value) = 0;
    } else {
      struct _cl_mem_buffer* buf = (struct _cl_mem_buffer*)mem;
      *((size_t *)param_value) = buf->sub_offset;
    }
    break;
  }

  return CL_SUCCESS;
}
Exemple #4
0
/*
 * Dynamically allocate space for a struct item plus the key and data
 * elements.  If name is non-NULL it is used as the key, else the
 * uid is the key.  Fills in datum from struct password.
 */
static struct cache_item *
make_pwitem(const struct passwd *pw, const char *name)
{
    char *cp;
    const char *pw_shell;
    size_t nsize, psize, csize, gsize, dsize, ssize, total;
    struct cache_item_pw *pwitem;
    struct passwd *newpw;
    debug_decl(make_pwitem, SUDO_DEBUG_NSS)

    /* If shell field is empty, expand to _PATH_BSHELL. */
    pw_shell = (pw->pw_shell == NULL || pw->pw_shell[0] == '\0')
	? _PATH_BSHELL : pw->pw_shell;

    /* Allocate in one big chunk for easy freeing. */
    nsize = psize = csize = gsize = dsize = ssize = 0;
    total = sizeof(*pwitem);
    FIELD_SIZE(pw, pw_name, nsize);
    FIELD_SIZE(pw, pw_passwd, psize);
#ifdef HAVE_LOGIN_CAP_H
    FIELD_SIZE(pw, pw_class, csize);
#endif
    FIELD_SIZE(pw, pw_gecos, gsize);
    FIELD_SIZE(pw, pw_dir, dsize);
    /* Treat shell specially since we expand "" -> _PATH_BSHELL */
    ssize = strlen(pw_shell) + 1;
    total += ssize;
    if (name != NULL)
	total += strlen(name) + 1;

    /* Allocate space for struct item, struct passwd and the strings. */
    pwitem = ecalloc(1, total);
    newpw = &pwitem->pw;

    /*
     * Copy in passwd contents and make strings relative to space
     * at the end of the struct.
     */
    memcpy(newpw, pw, sizeof(*pw));
    cp = (char *)(pwitem + 1);
    FIELD_COPY(pw, newpw, pw_name, nsize);
    FIELD_COPY(pw, newpw, pw_passwd, psize);
#ifdef HAVE_LOGIN_CAP_H
    FIELD_COPY(pw, newpw, pw_class, csize);
#endif
    FIELD_COPY(pw, newpw, pw_gecos, gsize);
    FIELD_COPY(pw, newpw, pw_dir, dsize);
    /* Treat shell specially since we expand "" -> _PATH_BSHELL */
    memcpy(cp, pw_shell, ssize);
    newpw->pw_shell = cp;
    cp += ssize;

    /* Set key and datum. */
    if (name != NULL) {
	memcpy(cp, name, strlen(name) + 1);
	pwitem->cache.k.name = cp;
    } else {
	pwitem->cache.k.uid = pw->pw_uid;
    }
    pwitem->cache.d.pw = newpw;
    pwitem->cache.refcnt = 1;

    debug_return_ptr(&pwitem->cache);
}
Exemple #5
0
*
* History:
* 15-Dec-1993 JohnC      Pulled functions from user\server.
\***************************************************************************/

#include "precomp.h"
#pragma hdrstop

/*
 * These arrays are used by GetClassWord/Long.
 */

// !!! can't we get rid of this and just special case GCW_ATOM

CONST BYTE afClassDWord[] = {
     FIELD_SIZE(CLS, spicnSm),          // GCL_HICONSM       (-34)
     0,
     FIELD_SIZE(CLS, atomClassName),    // GCW_ATOM          (-32)
     0,
     0,
     0,
     0,
     0,
     FIELD_SIZE(CLS, style),            // GCL_STYLE         (-26)
     0,
     FIELD_SIZE(CLS, lpfnWndProc),      // GCL_WNDPROC       (-24)
     0,
     0,
     0,
     FIELD_SIZE(CLS, cbclsExtra),       // GCL_CBCLSEXTRA    (-20)
     0,
/**
 * Handle adding a class type.
 *
 * @param df The debug file to add information to.
 * @param cl The class to add to the debugging file.
 */
static void dfHandleClass(struct debug_file *df, struct Hjava_lang_Class *cl)
{
	int lpc;

	assert(df != NULL);
	assert(cl != NULL);

	/* Allocate a type id if necessary. */
	if( cl->stab_id == 0 )
	{
		cl->stab_id = df->df_current_type_id + 1;
		df->df_current_type_id += 2;
	}
	/* Add the structure type, */
	fmanglef(df->df_file,
		 ".stabs \"%t",
		 "/", ".", cl->name->data);
	if( cl->loader != NULL )
	{
	    fmanglef(df->df_file,
		     "_%p",
		     cl->loader);
	}
	fprintf(df->df_file,
		":T%d=s%d",
		cl->stab_id - 1,
		CLASS_FSIZE(cl));
	/* ... fill in the base fields/class, */
	if( cl->superclass == NULL )
	{
		fprintf(df->df_file,
			"vtable:%d,%d,%d;",
			STYPE_DISPATCH_TABLE,
			0,
			sizeof(dispatchTable *) * 8);
		fprintf(df->df_file,
			"_$lock:%d,%d,%d;",
			STYPE_ILOCK,
			sizeof(dispatchTable *) * 8,
			sizeof(iLock *) * 8);
	}
	else
	{
		fprintf(df->df_file,
			"!1,020,%d;",
			cl->superclass->stab_id - 1);
	}
	/* ... fill in the instance fields, */
	for( lpc = 0; lpc < CLASS_NIFIELDS(cl); lpc++ )
	{
		fields *fld = CLASS_IFIELDS(cl);
		struct Hjava_lang_Class *ftype;
		
		if( (ftype = FIELD_TYPE(&fld[lpc])) != NULL )
		{
			fprintf(df->df_file,
				"%s:/%d%d,%d,%d;",
				fld[lpc].name->data,
				acc2prot(fld[lpc].accflags),
				ftype->stab_id,
				FIELD_BOFFSET(&fld[lpc]) * 8,
				FIELD_SIZE(&fld[lpc]) * 8);
		}
	}
	/* ... the static fields, and */
	for( lpc = 0; lpc < CLASS_NSFIELDS(cl); lpc++ )
	{
		fields *fld = CLASS_SFIELDS(cl);
		struct Hjava_lang_Class *ftype;

		if( (ftype = FIELD_TYPE(&fld[lpc])) != NULL )
		{
			fprintf(df->df_file,
				"%s:/%d%d:",
				fld[lpc].name->data,
				acc2prot(fld[lpc].accflags),
				ftype->stab_id);
			fmanglef(df->df_file,
				 "_ZN%q%d%sE;",
				 df_quals, cl->name->data, cl->loader,
				 strlen(fld[lpc].name->data),
				 fld[lpc].name->data);
		}
	}
	/* ... the synthetic 'class' static member. */
	fmanglef(df->df_file,
		 "class:xsHjava_lang_Class:"
		 ":_ZN%q%d%sE;",
		 df_quals, cl->name->data, cl->loader,
		 strlen("class"),
		 "class");
	fprintf(df->df_file, ";\",%d,0,0,0\n", N_LSYM);
	/* Add a typedef and */
	fmanglef(df->df_file,
		 ".stabs \"%t",
		 "/", ".", cl->name->data);
	if( cl->loader != NULL )
	{
	    fprintf(df->df_file, "_%p", cl->loader);
	}
	fprintf(df->df_file,
		":t%d\",%d,0,0,0\n",
		cl->stab_id - 1,
		N_LSYM);
	/* ... an anonymous pointer type. */
	fprintf(df->df_file,
		".stabs \" :%d=*%d\",%d,0,0,0\n",
		cl->stab_id,
		cl->stab_id - 1,
		N_LSYM);
	
	/* Add symbols and their values. */
	for( lpc = 0; lpc < CLASS_NSFIELDS(cl); lpc++ )
	{
		fields *fld = CLASS_SFIELDS(cl);
		struct Hjava_lang_Class *ftype;

		if( (ftype = FIELD_TYPE(&fld[lpc])) != NULL )
		{
			fmanglef(df->df_file,
				 ".globl _ZN%q%d%sE\n",
				 df_quals, cl->name->data, cl->loader,
				 strlen(fld[lpc].name->data),
				 fld[lpc].name->data);
			
			fmanglef(df->df_file,
				 "_ZN%q%d%sE = %p\n",
				 df_quals, cl->name->data, cl->loader,
				 strlen(fld[lpc].name->data),
				 fld[lpc].name->data,
				 FIELD_ADDRESS(&fld[lpc]));

			fmanglef(df->df_file,
				 ".stabs \"_ZN%q%d%sE:",
				 df_quals, cl->name->data, cl->loader,
				 strlen(fld[lpc].name->data),
				 fld[lpc].name->data);
			fprintf(df->df_file,
				"G%d\",%d,0,0,0\n",
				ftype->stab_id,
				N_GSYM);
		}
	}
	fmanglef(df->df_file,
		 ".globl _ZN%q%d%sE\n",
		 df_quals, cl->name->data, cl->loader,
		 strlen("class"),
		 "class");
	
	fmanglef(df->df_file, "_ZN%q%d%sE = %p\n",
		 df_quals, cl->name->data, cl->loader,
		 strlen("class"),
		 "class",
		 cl);
	
	fmanglef(df->df_file, ".stabs \"_ZN%q%d%sE:",
		 df_quals, cl->name->data, cl->loader,
		 strlen("class"),
		 "class");
	fprintf(df->df_file,
		"GxsHjava_lang_Class:\",%d,0,0,0\n",
		N_GSYM);
}
Exemple #7
0
/*
 * Dynamically allocate space for a struct item plus the key and data
 * elements.  If name is non-NULL it is used as the key, else the
 * uid is the key.  Fills in datum from struct password.
 *
 * We would like to fill in the encrypted password too but the
 * call to the shadow function could overwrite the pw buffer (NIS).
 */
static struct cache_item *
make_pwitem(const struct passwd *pw, const char *name)
{
    char *cp;
    const char *pw_shell;
    size_t nsize, psize, csize, gsize, dsize, ssize, total;
    struct cache_item *item;
    struct passwd *newpw;

    /* If shell field is empty, expand to _PATH_BSHELL. */
    pw_shell = (pw->pw_shell == NULL || pw->pw_shell[0] == '\0')
	? _PATH_BSHELL : pw->pw_shell;

    /* Allocate in one big chunk for easy freeing. */
    nsize = psize = csize = gsize = dsize = ssize = 0;
    total = sizeof(struct cache_item) + sizeof(struct passwd);
    FIELD_SIZE(pw, pw_name, nsize);
    FIELD_SIZE(pw, pw_passwd, psize);
#ifdef HAVE_LOGIN_CAP_H
    FIELD_SIZE(pw, pw_class, csize);
#endif
    FIELD_SIZE(pw, pw_gecos, gsize);
    FIELD_SIZE(pw, pw_dir, dsize);
    /* Treat shell specially since we expand "" -> _PATH_BSHELL */
    ssize = strlen(pw_shell) + 1;
    total += ssize;
    if (name != NULL)
	total += strlen(name) + 1;

    /* Allocate space for struct item, struct passwd and the strings. */
    if ((item = malloc(total)) == NULL)
	    return NULL;
    cp = (char *) item + sizeof(struct cache_item);

    /*
     * Copy in passwd contents and make strings relative to space
     * at the end of the buffer.
     */
    newpw = (struct passwd *) cp;
    memcpy(newpw, pw, sizeof(struct passwd));
    cp += sizeof(struct passwd);
    FIELD_COPY(pw, newpw, pw_name, nsize);
    FIELD_COPY(pw, newpw, pw_passwd, psize);
#ifdef HAVE_LOGIN_CAP_H
    FIELD_COPY(pw, newpw, pw_class, csize);
#endif
    FIELD_COPY(pw, newpw, pw_gecos, gsize);
    FIELD_COPY(pw, newpw, pw_dir, dsize);
    /* Treat shell specially since we expand "" -> _PATH_BSHELL */
    memcpy(cp, pw_shell, ssize);
    newpw->pw_shell = cp;
    cp += ssize;

    /* Set key and datum. */
    if (name != NULL) {
	memcpy(cp, name, strlen(name) + 1);
	item->k.name = cp;
    } else {
	item->k.uid = pw->pw_uid;
    }
    item->d.pw = newpw;
    item->refcnt = 1;

    return item;
}