コード例 #1
0
ファイル: lifl.c プロジェクト: binaryf/LIFL
void  sql_write(const char* path,const char* op)
{
    memset(&logg,0,sizeof(logg));

    ++id;
    logg.logg_id=id;

    get_timestamp(0,logg.time);
    strncpy(logg.operation,op,32);
    
    // REMEMBER: path my be non existing //

    char *absolute_path;
    char *relative_path;
    absolute_path=get_abs_path(path);
    relative_path=get_rel_path(path);
    strncpy(logg.file,absolute_path,1024);
    
    struct stat stbuf;
    if(lstat(relative_path,&stbuf)==0)
    {
        logg.protection=(unsigned int)stbuf.st_mode;

        uid_t uid;
        uid=stbuf.st_uid;
        size_t buflen;
        buflen=sysconf(_SC_GETPW_R_SIZE_MAX);
        if(buflen==-1) exit(EXIT_FAILURE);
        char *buf;
        buf=malloc(buflen);
        if(!buf) exit(EXIT_FAILURE);
        struct passwd pwd;
        struct passwd *pwd_result;
        if(getpwuid_r(uid,&pwd,buf,buflen,&pwd_result)==0)
        {
            if(pwd_result) strncpy(logg.owner,pwd.pw_name,256);
        }
        free(buf);
        gid_t gid;
        gid=stbuf.st_gid;
        buflen=sysconf(_SC_GETGR_R_SIZE_MAX);
        if(buflen==-1) exit(EXIT_FAILURE);
        buf=malloc(buflen);
        if(!buf) exit(EXIT_FAILURE);
        struct group grp;
        struct group *grp_result;
        if(getgrgid_r(gid,&grp,buf,buflen,&grp_result)==0)
        {
            if(grp_result) strncpy(logg.group,grp.gr_name,256);
        }
        free(buf);
    }
    free(absolute_path);
    free(relative_path);

    strncpy(logg.host,conf.hostname,256);
    strncpy(logg.tag,conf.tagname,64); 
    
    logg.uid=(unsigned int)fuse_get_context()->uid;
    logg.gid=(unsigned int)fuse_get_context()->gid; 
    logg.pid=(unsigned int)fuse_get_context()->pid;

    if(conf.log_username)
    {
        uid_t uid;
        uid=fuse_get_context()->uid;
        size_t buflen;
        buflen=sysconf(_SC_GETPW_R_SIZE_MAX);
        if(buflen==-1) exit(EXIT_FAILURE);
        char *buf;
        buf=malloc(buflen);
        if(!buf) exit(EXIT_FAILURE);
        struct passwd pwd;
        struct passwd *result;
        if(getpwuid_r(uid,&pwd,buf,buflen,&result)==0)
        {
            if(result) strncpy(logg.username,pwd.pw_name,256);
        }
        free(buf);
        
        if(is_str(logg.username))
        {
            if(conf.log_tty||conf.log_remote_host||conf.log_login_time)
            {
                setutxent();
                struct utmpx *utx;
                while((utx=getutxent()))
                {
                    if(!strcmp(logg.username,utx->ut_user))
                    {
                       if(conf.log_tty) strncpy(logg.tty,utx->ut_line,16);
                       if(conf.log_remote_host) strncpy(logg.remote_host,utx->ut_host,256);
                       if(conf.log_login_time) get_timestamp(utx->ut_tv.tv_sec,logg.login_time);
                   }
                }
                endutxent();
            }
        }
    }
    if(conf.log_groupname)
    {
        gid_t gid;
        gid=fuse_get_context()->gid;
        size_t buflen;
        buflen=sysconf(_SC_GETGR_R_SIZE_MAX);
        if(buflen==-1) exit(EXIT_FAILURE);
        char *buf;
        buf=malloc(buflen);
        if(!buf) exit(EXIT_FAILURE);
        struct group grp;
        struct group *result;
        if(getgrgid_r(gid,&grp,buf,buflen,&result)==0)
        {
            if(result) strncpy(logg.groupname,grp.gr_name,256);
        }
        free(buf);
    }

    if(conf.log_cmd)
    {
        size_t size;
        size=strlen("/proc//cmdline")+10+1;
        char *buf;
        buf=malloc(size);
        if(!buf) exit(EXIT_FAILURE);

        if(snprintf(buf,size,"/proc/%i/cmdline",logg.pid))
        {
            FILE *fp;
            fp=fopen(buf,"r");
            free(buf);
            if(!fp) return;
            buf=malloc(1024);
            if(!buf) exit(EXIT_FAILURE);
            size_t bytes_r;
            bytes_r=fread(buf,1,1024,fp);
            fclose(fp);
            if(bytes_r==0)
            {
                free(buf);
                return;
            }
            strncpy(logg.cmd,buf,1024);    
            if(conf.log_args)
            {
                int i=0;
                while(++i<bytes_r-1) if(buf[i]==0x00) buf[i]=0x20; 
                int str_off=strlen(logg.cmd);
                strncpy(logg.args,&buf[str_off],1024);
                free(buf);
            } 
        }
    }
    if(conf.log_ppid)
    {
        size_t size;
        size=strlen("/proc//status")+10+1;
        char *buf;
        buf=malloc(size);
        if(!buf) exit(EXIT_FAILURE);
        if(snprintf(buf,size,"/proc/%i/status",logg.pid))
        {
            FILE *fp;
            fp=fopen(buf,"r");
            free(buf);
            if(!fp) return;
            char *line=NULL;
            size_t len=0;
            while(getline(&line,&len,fp)!=-1)
            {
                if(!strncmp(line,"PPid:",5))
                {
                    if((strlen(line)-6)<20) sscanf(line,"PPid:\t%i",&logg.ppid);
                    break;
                }
            }
            fclose(fp);
            free(line);
        }
        if(conf.log_ppid_cmd)
        {
            size_t size;
            size=strlen("/proc//cmdline")+10+1;
            char *buf;
            buf=malloc(size);
            if(!buf) exit(EXIT_FAILURE);

            if(snprintf(buf,size,"/proc/%i/cmdline",logg.ppid))
            {
                FILE *fp;
                fp=fopen(buf,"r");
                free(buf);
                if(!fp) return;
                buf=malloc(1024);
                if(!buf) exit(EXIT_FAILURE);
                size_t bytes_r;
                bytes_r=fread(buf,1,1024,fp);
                fclose(fp);
                if(bytes_r==0)
                {
                    free(buf);
                    return;
                }
                strncpy(logg.p_cmd,buf,1024);
                free(buf);
            }
        }
    } 
    
    size_t size;
    size=strlen(INS)
    +strlen(conf.db_database)
    +strlen(conf.db_table)
    +20
    +strlen(logg.time)
    +strlen(logg.host)
    +strlen(logg.tag)
    +strlen(logg.operation)
    +10
    +10
    +strlen(logg.username)
    +strlen(logg.groupname)
    +strlen(logg.tty)
    +strlen(logg.login_time)
    +strlen(logg.remote_host)
    +strlen(logg.cmd)
    +strlen(logg.args)
    +10
    +10
    +strlen(logg.p_cmd)
    +strlen(logg.file)
    +10
    +strlen(logg.owner)
    +strlen(logg.group);

    char *buf;
    buf=malloc(size);
    if(!buf) exit(EXIT_FAILURE);

    if((size=snprintf(buf,size,
        INS,
        conf.db_database,
        conf.db_table,
        logg.logg_id,
        logg.time,
        logg.host,
        logg.tag,
        logg.operation,
        logg.uid,
        logg.gid,
        logg.username,
        logg.groupname,
        logg.tty,
        logg.login_time,
        logg.remote_host,
        logg.cmd,
        logg.args,
        logg.pid,
        logg.ppid,
        logg.p_cmd,
        logg.file,
        logg.protection,
        logg.owner,
        logg.group))) {

            if(mysql_real_query(conn,buf,size)) sql_err(conn,buf);    
    }
    free(buf); 
}
コード例 #2
0
ファイル: idmapper.c プロジェクト: Anuradha-Talur/nfs-ganesha
static bool xdr_encode_nfs4_princ(XDR *xdrs, uint32_t id, bool group)
{
	const struct gsh_buffdesc *found;
	uint32_t not_a_size_t;
	bool success = false;

	PTHREAD_RWLOCK_rdlock(group ? &idmapper_group_lock :
			      &idmapper_user_lock);
	if (group)
		success = idmapper_lookup_by_gid(id, &found);
	else
		success = idmapper_lookup_by_uid(id, &found, NULL);

	if (likely(success)) {
		not_a_size_t = found->len;

		/* Fully qualified owners are always stored in the
		   hash table, no matter what our lookup method. */
		success =
		    inline_xdr_bytes(xdrs, (char **)&found->addr, &not_a_size_t,
				     UINT32_MAX);
		PTHREAD_RWLOCK_unlock(group ? &idmapper_group_lock :
				      &idmapper_user_lock);
		return success;
	} else {
		PTHREAD_RWLOCK_unlock(group ? &idmapper_group_lock :
				      &idmapper_user_lock);
		int rc;
		int size;
		bool looked_up = false;
		char *namebuff = NULL;
		struct gsh_buffdesc new_name;

		if (nfs_param.nfsv4_param.use_getpwnam) {
			if (group)
				size = sysconf(_SC_GETGR_R_SIZE_MAX);
			else
				size = sysconf(_SC_GETPW_R_SIZE_MAX);
			if (size == -1)
				size = PWENT_BEST_GUESS_LEN;
			new_name.len = size;
			size += owner_domain.len + 2;
		} else {
			size = NFS4_MAX_DOMAIN_LEN + 2;
		}

		namebuff = alloca(size);

		new_name.addr = namebuff;

		if (nfs_param.nfsv4_param.use_getpwnam) {
			char *cursor;
			bool nulled;

			if (group) {
				struct group g;
				struct group *gres;

				rc = getgrgid_r(id, &g, namebuff, new_name.len,
						&gres);
				nulled = (gres == NULL);
			} else {
				struct passwd p;
				struct passwd *pres;

				rc = getpwuid_r(id, &p, namebuff, new_name.len,
						&pres);
				nulled = (pres == NULL);
			}

			if ((rc == 0) && !nulled) {
				new_name.len = strlen(namebuff);
				cursor = namebuff + new_name.len;
				*(cursor++) = '@';
				++new_name.len;
				memcpy(cursor, owner_domain.addr,
				       owner_domain.len);
				new_name.len += owner_domain.len;
				looked_up = true;
			} else {
				LogInfo(COMPONENT_IDMAPPER,
					"%s failed with code %d.",
					(group ? "getgrgid_r" : "getpwuid_r"),
					rc);
			}
		} else {
#ifdef USE_NFSIDMAP
			if (group) {
				rc = nfs4_gid_to_name(id, owner_domain.addr,
						      namebuff,
						      NFS4_MAX_DOMAIN_LEN + 1);
			} else {
				rc = nfs4_uid_to_name(id, owner_domain.addr,
						      namebuff,
						      NFS4_MAX_DOMAIN_LEN + 1);
			}
			if (rc == 0) {
				new_name.len = strlen(namebuff);
				looked_up = true;
			} else {
				LogInfo(COMPONENT_IDMAPPER,
					"%s failed with code %d.",
					(group ? "nfs4_gid_to_name" :
					"nfs4_uid_to_name"), rc);
			}
#else				/* USE_NFSIDMAP */
			looked_up = false;
#endif				/* !USE_NFSIDMAP */
		}

		if (!looked_up) {
			if (nfs_param.nfsv4_param.allow_numeric_owners) {
				LogInfo(COMPONENT_IDMAPPER,
					"Lookup for %d failed, using numeric %s",
					id, (group ? "group" : "owner"));
				/* 2**32 is 10 digits long in decimal */
				sprintf(namebuff, "%u", id);
				new_name.len = strlen(namebuff);
			} else {
				LogInfo(COMPONENT_IDMAPPER,
					"Lookup for %d failed, using nobody.",
					id);
				memcpy(new_name.addr, "nobody", 6);
				new_name.len = 6;
			}
		}

		/* Add to the cache and encode the result. */
		PTHREAD_RWLOCK_wrlock(group ? &idmapper_group_lock :
				      &idmapper_user_lock);
		if (group)
			success = idmapper_add_group(&new_name, id);
		else
			success = idmapper_add_user(&new_name, id, NULL, false);

		PTHREAD_RWLOCK_unlock(group ? &idmapper_group_lock :
				      &idmapper_user_lock);
		if (unlikely(!success)) {
			LogMajor(COMPONENT_IDMAPPER, "%s failed.",
				 group ? "idmapper_add_group" :
				 "idmaper_add_user");
		}
		not_a_size_t = new_name.len;
		return inline_xdr_bytes(xdrs, (char **)&new_name.addr,
					&not_a_size_t, UINT32_MAX);
	}
}
コード例 #3
0
ファイル: replyparser.c プロジェクト: QuentinPerez/Droplet
dpl_status_t
dpl_posix_get_metadatum_from_value(const char *key,
                                   dpl_value_t *val,
                                   dpl_metadatum_func_t metadatum_func,
                                   void *cb_arg,
                                   dpl_dict_t *metadata,
                                   dpl_sysmd_t *sysmdp)
{
  dpl_status_t ret, ret2;
  int iret;
  char buf[256];
  struct metadata_conven mc = { .metadata=metadata, .sysmdp=sysmdp };

  if (sysmdp)
    {
      if (!strcmp(key, "atime"))
        {
          assert(val->type == DPL_VALUE_STRING);
          sysmdp->atime = strtoul(dpl_sbuf_get_str(val->string), NULL, 0);
          sysmdp->mask |= DPL_SYSMD_MASK_ATIME;
        }
      else if (!strcmp(key, "mtime"))
        {
          assert(val->type == DPL_VALUE_STRING);
          sysmdp->mtime = strtoul(dpl_sbuf_get_str(val->string), NULL, 0);
          sysmdp->mask |= DPL_SYSMD_MASK_MTIME;
        }
      else if (!strcmp(key, "ctime"))
        {
          assert(val->type == DPL_VALUE_STRING);
          sysmdp->ctime = strtoul(dpl_sbuf_get_str(val->string), NULL, 0);
          sysmdp->mask |= DPL_SYSMD_MASK_CTIME;
        }
      else if (!strcmp(key, "size"))
        {
          assert(val->type == DPL_VALUE_STRING);
          sysmdp->size = strtoul(dpl_sbuf_get_str(val->string), NULL, 0);
          sysmdp->mask |= DPL_SYSMD_MASK_SIZE;
        }
      else if (!strcmp(key, "uid"))
        {
          uid_t uid;
          struct passwd pwd, *pwdp;

          assert(val->type == DPL_VALUE_STRING);
          uid = atoi(dpl_sbuf_get_str(val->string));
          iret = getpwuid_r(uid, &pwd, buf, sizeof (buf), &pwdp);
          if (iret == -1)
            {
              perror("getpwuid");
              ret = DPL_FAILURE;
              goto end;
            }
          snprintf(sysmdp->owner, sizeof (sysmdp->owner), "%s", pwdp->pw_name);
          sysmdp->mask |= DPL_SYSMD_MASK_OWNER;
        }
      else if (!strcmp(key, "gid"))
        {
          gid_t gid;
          struct group grp, *grpp;

          assert(val->type == DPL_VALUE_STRING);
          gid = atoi(dpl_sbuf_get_str(val->string));
          iret = getgrgid_r(gid, &grp, buf, sizeof (buf), &grpp);
          if (iret == -1)
            {
              perror("getgrgid");
              ret = DPL_FAILURE;
              goto end;
            }
          snprintf(sysmdp->group, sizeof (sysmdp->group), "%s", grpp->gr_name);
          sysmdp->mask |= DPL_SYSMD_MASK_GROUP;
        }
      else if (!strcmp(key, "ino"))
        {
          assert(val->type == DPL_VALUE_STRING);
          snprintf(sysmdp->id, sizeof (sysmdp->id), "%s",
                   dpl_sbuf_get_str(val->string));
          sysmdp->mask |= DPL_SYSMD_MASK_ID;
        }
    }

  if (!strcmp(key, "xattr"))
    {
      //this is the metadata object
      if (DPL_VALUE_SUBDICT != val->type)
        {
          ret = DPL_EINVAL;
          goto end;
        }

      if (metadata)
        {
          if (metadatum_func)
            {
              ret2 = metadatum_func(cb_arg, key, val);
              if (DPL_SUCCESS != ret2)
                {
                  ret = ret2;
                  goto end;
                }
            }

          //add xattr's md into metadata
          ret2 = dpl_dict_iterate(val->subdict,
                                  cb_posix_get_metadatum_from_xattr_value,
                                  &mc);
          if (DPL_SUCCESS != ret2)
            {
              ret = ret2;
              goto end;
            }
        }
    }
  
  ret = DPL_SUCCESS;
  
 end:

  return ret;
}
コード例 #4
0
ファイル: ipa_extdom_common.c プロジェクト: cajunken/freeipa
int handle_request(struct ipa_extdom_ctx *ctx, struct extdom_req *req,
                   struct extdom_res **res)
{
    int ret;
    char *domain_name = NULL;
    char *sid_str = NULL;
    size_t buf_len;
    char *buf = NULL;
    long pw_max;
    long gr_max;
    struct pwd_grp pg_data;
    struct passwd *pwd_result = NULL;
    struct group *grp_result = NULL;
    enum sss_id_type id_type;
    char *fq_name = NULL;
    char *sep;


    pw_max = sysconf(_SC_GETPW_R_SIZE_MAX);
    gr_max = sysconf(_SC_GETGR_R_SIZE_MAX);

    if (pw_max == -1 && gr_max == -1) {
        buf_len = 16384;
    } else {
        buf_len = MAX(pw_max, gr_max);
    }

    buf = malloc(sizeof(char) * buf_len);
    if (buf == NULL) {
        return LDAP_OPERATIONS_ERROR;
    }

    switch (req->input_type) {
    case INP_POSIX_UID:
        if (req->request_type == REQ_SIMPLE) {
            ret = sss_nss_getsidbyid(req->data.posix_uid.uid, &sid_str,
                                     &id_type);
        } else {
            id_type = SSS_ID_TYPE_UID;
            ret = getpwuid_r(req->data.posix_uid.uid, &pg_data.data.pwd, buf,
                             buf_len, &pwd_result);
        }

        domain_name = strdup(req->data.posix_uid.domain_name);
        break;
    case INP_POSIX_GID:
        if (req->request_type == REQ_SIMPLE) {
            ret = sss_nss_getsidbyid(req->data.posix_uid.uid, &sid_str,
                                     &id_type);
        } else {
            id_type = SSS_ID_TYPE_GID;
            ret = getgrgid_r(req->data.posix_gid.gid, &pg_data.data.grp, buf,
                             buf_len, &grp_result);
        }

        domain_name = strdup(req->data.posix_gid.domain_name);
        break;
    case INP_SID:
        ret = sss_nss_getnamebysid(req->data.sid, &fq_name, &id_type);
        if (ret != 0) {
            ret = LDAP_OPERATIONS_ERROR;
            goto done;
        }

        sep = strrchr(fq_name, SSSD_DOMAIN_SEPARATOR);
        if (sep == NULL) {
            ret = LDAP_OPERATIONS_ERROR;
            goto done;
        }

        ret = asprintf(&domain_name, "%s", sep+1);
        if (ret == -1) {
            ret = LDAP_OPERATIONS_ERROR;
            domain_name = NULL; /* content is undefined according to
                                   asprintf(3) */
            goto done;
        }

        switch(id_type) {
        case SSS_ID_TYPE_UID:
        case SSS_ID_TYPE_BOTH:
            ret = getpwnam_r(fq_name, &pg_data.data.pwd, buf, buf_len,
                             &pwd_result);
            break;
        case SSS_ID_TYPE_GID:
            ret = getgrnam_r(fq_name, &pg_data.data.grp, buf, buf_len,
                             &grp_result);
            break;
        default:
            ret = LDAP_OPERATIONS_ERROR;
            goto done;
        }
        break;
    case INP_NAME:
        ret = asprintf(&fq_name, "%s%c%s", req->data.name.object_name,
                                           SSSD_DOMAIN_SEPARATOR,
                                           req->data.name.domain_name);
        if (ret == -1) {
            ret = LDAP_OPERATIONS_ERROR;
            fq_name = NULL; /* content is undefined according to
                               asprintf(3) */
            goto done;
        }

        if (req->request_type == REQ_SIMPLE) {
            ret = sss_nss_getsidbyname(fq_name, &sid_str, &id_type);
        } else {
            id_type = SSS_ID_TYPE_UID;
            ret = getpwnam_r(fq_name, &pg_data.data.pwd, buf, buf_len,
                             &pwd_result);
            if (ret == 0 && pwd_result == NULL) { /* no user entry found */
                id_type = SSS_ID_TYPE_GID;
                ret = getgrnam_r(fq_name, &pg_data.data.grp, buf, buf_len,
                                 &grp_result);
            }
        }
        domain_name = strdup(req->data.name.domain_name);
        break;
    default:
        ret = LDAP_PROTOCOL_ERROR;
        goto done;
    }

    if (ret != 0) {
        ret = LDAP_OPERATIONS_ERROR;
        goto done;
    } else if (ret == 0 && pwd_result == NULL && grp_result == NULL &&
               sid_str == NULL) {
        ret = LDAP_NO_SUCH_OBJECT;
        goto done;
    }

    if (domain_name == NULL) {
        ret = LDAP_OPERATIONS_ERROR;
        goto done;
    }

    ret = create_response(req, &pg_data, sid_str, id_type, domain_name, res);
    if (ret != 0) {
        ret = LDAP_OPERATIONS_ERROR;
        goto done;
    }


    ret = LDAP_SUCCESS;

done:
    free(buf);
    free(fq_name);
    free(domain_name);
    free(sid_str);

    return ret;
}
コード例 #5
0
ファイル: group.c プロジェクト: sofuture/bitrig
static void *
test(void *arg)
{
    gid_t gid = *(gid_t *)arg;
    gid_t ogid;
    struct group grpbuf;
    struct group *grp;
    char **p;
    char buffer[5000];
    char buf[2048];
    char *cpy[128];
    int i;
    int count1, count2;
    char *s;
    char *oname;
    char *opasswd;
    size_t len;

    /* Acquire lock for running first part. */
    CHECKr(pthread_mutex_lock(&display));

    /* Store magic name to test for non-alteration */
    grpbuf.gr_name = fail;

    /* Call getgrgid_r() */
    printf("gid %d\n", gid);
    CHECKr(getgrgid_r(gid, &grpbuf, buffer, sizeof(buffer), &grp));

    /* Test for non-alteration of group structure */
    ASSERT(grp->gr_name != fail);

    /* We must get the right group */
    ASSERT(grp->gr_gid == gid);

    s = buf;	/* Keep our private buffer on the stack */
    len = sizeof(buf);

    /* copy gr_name */
    strlcpy(oname = s, grp->gr_name, len);
    len -= 1 + strlen(s);
    s += 1 + strlen(s);

    /* copy gr_passwd */
    strlcpy(opasswd = s, grp->gr_passwd, len);
    len -= 1 + strlen(s);
    s += 1 + strlen(s);

    /* copy gr_gid */
    ogid = grp->gr_gid;

    /* copy gr_mem */
    for (i = 0, p = grp->gr_mem; *p; p++) {
        strlcpy(cpy[i] = s, *p, len);
        i++;
        len -= 1 + strlen(s);
        s += 1 + strlen(s);
    }
    cpy[i] = NULL;

#if 0
    printf("now:    %s:%s:%d:", grp->gr_name, grp->gr_passwd, grp->gr_gid);
    for (p = grp->gr_mem; *p; p++)
        printf("%s%s", *p, *(p+1) == NULL ? "": ",");
    printf("\n");
#endif

#ifdef DEBUG /* debugging this program */
    printf("buf = \"");
    for (i = 0; i < s - buf; i++)
        if (buf[i] == '\0')	printf("\\0");
        else printf("%c", buf[i]);
    printf("\"\n");
#endif

    /* Inform main that we have finished */
    done_count++;
    CHECKr(pthread_cond_signal(&done));

    /* Allow other threads to run first part */
    CHECKr(pthread_mutex_unlock(&display));

    /* Acquire lock for the second part */
    CHECKr(pthread_mutex_lock(&display2));

    count1 = 0;
    printf("before: %s:%s:%d:", oname, opasswd, ogid);
    for (p = cpy; *p; p++)  {
        count1++;
        printf("%s%s", *p, *(p+1) == NULL ? "": ",");
    }
    printf("\n");

    count2 = 0;
    printf("after:  %s:%s:%d:", grp->gr_name, grp->gr_passwd, grp->gr_gid);
    for (p = grp->gr_mem; *p; p++)  {
        count2++;
        printf("%s%s", *p, *(p+1) == NULL ? "": ",");
    }
    printf("\n");

    CHECKr(pthread_mutex_unlock(&display2));

    if (count1 != count2)
        return "gr_mem length changed";
    for (i = 0; i < count1; i++)
        if (strcmp(cpy[i], grp->gr_mem[i]) != 0)
            return "gr_mem list changed";
    if (strcmp(grp->gr_name, oname) != 0)
        return "gr_name changed";
    if (strcmp(grp->gr_passwd, opasswd) != 0)
        return "gr_passwd changed";
    if (grp->gr_gid != ogid)
        return "gr_gid changed";
    return NULL;
}
コード例 #6
0
ファイル: passwd.c プロジェクト: vocho/openqnx
void main(int argc, char *argv[]) {
	int	i;
	struct	group	*g;
	struct passwd *p;

	switch(argc > 1 ? argv[1][0] : -1) {
	case	'0':	/*	walk through file, spitting group entries */
		while ((g=getgrent()) != NULL) {
			prt_grent(g,stdout);
		}
		break;
	case	'1':	/*	walk arg list, finding groups */
		for (i=2; i < argc; i++) {
			if ((g=getgrnam(argv[i])) != NULL) {
				prt_grent(g,stdout);
			} else {
				printf("no group '%s'\n",argv[i]);
			}
		}
		break;
	case	'2':	/* walk arg list, finding gid's */
		for (i=2; i < argc; i++) {
		gid_t	x;
			x = strtol(argv[i],NULL,10);
			if ((g=getgrgid(x)) != NULL) {
				prt_grent(g,stdout);
			} else {
				printf("no group '%u'\n",x);
			}
		}
		break;
	case	'3':	/* setgroups */
		if(argc > 2) initgroups(argv[2], argc > 3 ? strtol(argv[3], 0, 10) : -1);
		break;
	case	'4':	/*	walk through file, spitting group entries */
		while ((p=getpwent()) != NULL) {
			prt_pwent(p,stdout);
		}
		break;
	case	'5':	/*	walk arg list, finding groups */
		for (i=2; i < argc; i++) {
			if ((p=getpwnam(argv[i])) != NULL) {
				prt_pwent(p,stdout);
			} else {
				printf("no user '%s'\n",argv[i]);
			}
		}
		break;
	case	'6':	/* walk arg list, finding gid's */
		for (i=2; i < argc; i++) {
		uid_t	x;
			x = strtol(argv[i],NULL,10);
			if ((p=getpwuid(x)) != NULL) {
				prt_pwent(p,stdout);
			} else {
				printf("no user '%u'\n",x);
			}
		}
		break;
	case	'7':	/* test getgrnam_r */
		if (argc >= 3) {
			struct group grp, *pgrp;
			char buffer[1024 +1];
			size_t bufsize = sizeof buffer;
			int rc;

			if (argc >= 4) {
				bufsize = strtol(argv[3],NULL,10);
			}

			rc = getgrnam_r(argv[2], &grp, buffer, bufsize, &pgrp);
			if (rc == EOK) {
				if (pgrp) {
					prt_grent(&grp, stdout);
				} else {
					printf("no group '%s'\n",argv[2]);
				}
			} else {
				printf("error finding group '%s' %s\n",argv[2], strerror(rc));
				assert(pgrp == NULL);
			}
		}
		break;
	case	'8':	/* test getgrgid_r */
		if (argc >= 3) {
			struct group grp, *pgrp;
			char buffer[1024 +1];
			size_t bufsize = sizeof buffer;
			int rc;
			gid_t x;

			if (argc >= 4) {
				bufsize = strtol(argv[3],NULL,10);
			}

			x = strtol(argv[2],NULL,10);
			rc = getgrgid_r(x, &grp, buffer, bufsize, &pgrp);
			if (rc == EOK) {
				if (pgrp) {
					prt_grent(&grp, stdout);
				} else {
					printf("no group '%u'\n",x);
				}
			} else {
				printf("error finding group '%u' %s\n",x, strerror(rc));
				assert(pgrp == NULL);
			}
		}
		break;
	case	'9':	/*	walk arg list, finding groups */
		if (argc >= 3) {
			struct passwd pwd, *ppwd;
			char buffer[1024 +1];
			size_t bufsize = sizeof buffer;
			int rc;

			if (argc >= 4) {
				bufsize = strtol(argv[3],NULL,10);
			}

			rc = getpwnam_r(argv[2], &pwd, buffer, bufsize, &ppwd);
			if (rc == EOK) {
				if (ppwd) {
					prt_pwent(&pwd, stdout);
				} else {
					printf("no user '%s'\n",argv[2]);
				}
			} else {
				printf("error finding user '%s' %s\n",argv[2], strerror(rc));
				assert(ppwd == NULL);
			}
		}
		break;
	case	'a':	/* walk arg list, finding gid's */
		if (argc >= 3) {
			struct passwd pwd, *ppwd;
			char buffer[1024 +1];
			size_t bufsize = sizeof buffer;
			int rc;
			uid_t x;

			if (argc >= 4) {
				bufsize = strtol(argv[3],NULL,10);
			}

			x = strtol(argv[2],NULL,10);
			rc = getpwuid_r(x, &pwd, buffer, bufsize, &ppwd);
			if (rc == EOK) {
				if (ppwd) {
					prt_pwent(&pwd, stdout);
				} else {
					printf("no user '%u'\n",x);
				}
			} else {
				printf("error finding user '%u' %s\n",x, strerror(rc));
				assert(ppwd == NULL);
			}
		}
		break;
	default:
		fprintf(stderr,"use: %s 0 | 1 group | 2 gid | 3 user [gid] | 4 | 5 user : 6 uid | 7 group | 8 guid | 9 user | a uid \n", argv[0]);
	}
}
コード例 #7
0
ファイル: idmapper.c プロジェクト: xushiwei/nfs-ganesha
/**
 *
 * gid2name: convert a gid to a name. 
 *
 * convert a uid to a name. 
 *
 * @param name [OUT]  the name of the user
 * @param gid  [IN]   the input gid
 *
 * return 1 if successful, 0 otherwise
 *
 */
int gid2name(char *name, gid_t * pgid)
{
#ifndef _USE_NFSIDMAP
  struct group g;
#ifndef _SOLARIS
  struct group *pg = NULL;
#endif
  static char buff[NFS4_MAX_DOMAIN_LEN]; /* Working area for getgrnam_r */
#endif

#ifdef _USE_NFSIDMAP
  int rc;

  if(gnamemap_get(*pgid, name) == ID_MAPPER_SUCCESS)
    {
      LogFullDebug(COMPONENT_IDMAPPER,
                   "gid2name: unamemap_get gid %d returned %s",
                   *pgid, name);
      return 1;
    }
  else
    {
      if(!nfsidmap_set_conf())
        {
          LogCrit(COMPONENT_IDMAPPER,
                  "gid2name: nfsidmap_set_conf failed");
          return 0;
        }

      rc = nfs4_gid_to_name(*pgid, idmap_domain, name, NFS4_MAX_DOMAIN_LEN);
      if(rc != 0)
        {
          LogDebug(COMPONENT_IDMAPPER,
                   "gid2name: nfs4_gid_to_name %d returned %d (%s)",
                   *pgid, -rc, strerror(-rc));
          return 0;
        }

      LogFullDebug(COMPONENT_IDMAPPER,
                   "gid2name: nfs4_gid_to_name gid %d returned %s",
                   *pgid, name);

      if(gidmap_add(name, *pgid) != ID_MAPPER_SUCCESS)
        {
          LogCrit(COMPONENT_IDMAPPER,
                  "gid2name: gidmap_add %s %d failed",
                  name, *pgid);
          return 0;
        }
    }

  return 1;

#else
  if(gnamemap_get(*pgid, name) == ID_MAPPER_SUCCESS)
    {
      LogFullDebug(COMPONENT_IDMAPPER,
                   "gid2name: gnamemap_get gid %d returned %s",
                   *pgid, name);
      return 1;
    }
  else
    {
#ifdef _SOLARIS
      if(getgrgid_r(*pgid, &g, buff, NFS4_MAX_DOMAIN_LEN) != 0)
#else
      if((getgrgid_r(*pgid, &g, buff, NFS4_MAX_DOMAIN_LEN, &pg) != 0) ||
	 (pg == NULL))
#endif                          /* _SOLARIS */
        {
          LogFullDebug(COMPONENT_IDMAPPER,
                       "gid2name: getgrgid_r %d failed",
                       *pgid);
          return 0;
        }

      strncpy(name, g.gr_name, NFS4_MAX_DOMAIN_LEN);

      LogFullDebug(COMPONENT_IDMAPPER,
                   "gid2name: getgrgid_r gid %d returned %s",
                   *pgid, name);

      if(gidmap_add(name, *pgid) != ID_MAPPER_SUCCESS)
        {
          LogCrit(COMPONENT_IDMAPPER,
                  "gid2name: gidmap_add %s %d failed",
                  name, *pgid);
          return 0;
        }
    }

  return 1;
#endif                          /* _USE_NFSIDMAP */
}                               /* gid2name */
コード例 #8
0
ファイル: scaffolding.c プロジェクト: dooodlesomething/torque
struct group *getgrnam_ext(

  char **user_buf,
  char *grp_name) /* I */

  {
  struct group *grp;
  char  *buf;
  long   bufsize;
  struct group *result;
  int rc;

  *user_buf = NULL;
  if (grp_name == NULL)
    return(NULL);

  bufsize = sysconf(_SC_GETGR_R_SIZE_MAX);
  if (bufsize == -1)
    bufsize = 8196;

  buf = (char *)malloc(bufsize);
  if (buf == NULL)
    {
    log_event(PBSEVENT_JOB, PBS_EVENTCLASS_JOB, __func__, "failed to allocate memory");
    return(NULL);
    }

  int alloc_size = sizeof(struct group);
  grp = (struct group *)calloc(1, alloc_size);
  if (grp == NULL)
    {
    log_event(PBSEVENT_JOB, PBS_EVENTCLASS_JOB, __func__, "could not allocate passwd structure");
    free(buf);
    return(NULL);
    }

  rc = getgrnam_r(grp_name, grp, buf, bufsize, &result);
  if ((rc) ||
      (result == NULL))
    {
    /* See if a number was passed in instead of a name */
    if (isdigit(grp_name[0]))
      {
      rc = getgrgid_r(atoi(grp_name), grp, buf, bufsize, &result);
      if ((rc == 0) &&
          (result != NULL))
        {
        *user_buf = buf;
        return(grp);
        }
      }

    sprintf(buf, "getgrnam_r failed: %d", rc);
    log_event(PBSEVENT_JOB, PBS_EVENTCLASS_JOB, __func__, buf);

    free(buf);
    free(grp);

    return (NULL);
    }

  *user_buf = buf;
  return(grp);
  } /* END getgrnam_ext() */
コード例 #9
0
static dbus_bool_t
fill_group_info (DBusGroupInfo    *info,
                 dbus_gid_t        gid,
                 const DBusString *groupname,
                 DBusError        *error)
{
  const char *group_c_str;

  _dbus_assert (groupname != NULL || gid != DBUS_GID_UNSET);
  _dbus_assert (groupname == NULL || gid == DBUS_GID_UNSET);

  if (groupname)
    group_c_str = _dbus_string_get_const_data (groupname);
  else
    group_c_str = NULL;
  
  /* For now assuming that the getgrnam() and getgrgid() flavors
   * always correspond to the pwnam flavors, if not we have
   * to add more configure checks.
   */
  
#if defined (HAVE_POSIX_GETPWNAM_R) || defined (HAVE_NONPOSIX_GETPWNAM_R)
  {
    struct group *g;
    int result;
    size_t buflen;
    char *buf;
    struct group g_str;
    dbus_bool_t b;

    /* retrieve maximum needed size for buf */
    buflen = sysconf (_SC_GETGR_R_SIZE_MAX);

    /* sysconf actually returns a long, but everything else expects size_t,
     * so just recast here.
     * https://bugs.freedesktop.org/show_bug.cgi?id=17061
     */
    if ((long) buflen <= 0)
      buflen = 1024;

    result = -1;
    while (1)
      {
        buf = dbus_malloc (buflen);
        if (buf == NULL)
          {
            dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
            return FALSE;
          }

        g = NULL;
#ifdef HAVE_POSIX_GETPWNAM_R
        if (group_c_str)
          result = getgrnam_r (group_c_str, &g_str, buf, buflen,
                               &g);
        else
          result = getgrgid_r (gid, &g_str, buf, buflen,
                               &g);
#else
        g = getgrnam_r (group_c_str, &g_str, buf, buflen);
        result = 0;
#endif /* !HAVE_POSIX_GETPWNAM_R */
        /* Try a bigger buffer if ERANGE was returned:
           https://bugs.freedesktop.org/show_bug.cgi?id=16727
        */
        if (result == ERANGE && buflen < 512 * 1024)
          {
            dbus_free (buf);
            buflen *= 2;
          }
        else
          {
            break;
          }
      }

    if (result == 0 && g == &g_str)
      {
        b = fill_user_info_from_group (g, info, error);
        dbus_free (buf);
        return b;
      }
    else
      {
        dbus_set_error (error, _dbus_error_from_errno (errno),
                        "Group %s unknown or failed to look it up\n",
                        group_c_str ? group_c_str : "???");
        dbus_free (buf);
        return FALSE;
      }
  }
#else /* ! HAVE_GETPWNAM_R */
  {
    /* I guess we're screwed on thread safety here */
    struct group *g;

    g = getgrnam (group_c_str);

    if (g != NULL)
      {
        return fill_user_info_from_group (g, info, error);
      }
    else
      {
        dbus_set_error (error, _dbus_error_from_errno (errno),
                        "Group %s unknown or failed to look it up\n",
                        group_c_str ? group_c_str : "???");
        return FALSE;
      }
  }
#endif  /* ! HAVE_GETPWNAM_R */
}
コード例 #10
0
ファイル: NativeIO.c プロジェクト: jebarba/hadoop
/*
 * public static native Stat fstat(FileDescriptor fd);
 */
JNIEXPORT jobject JNICALL
Java_org_apache_hadoop_io_nativeio_NativeIO_fstat(
  JNIEnv *env, jclass clazz, jobject fd_object)
{
  jobject ret = NULL;
  char *pw_buf = NULL;

  int fd = fd_get(env, fd_object);
  PASS_EXCEPTIONS_GOTO(env, cleanup);

  struct stat s;
  int rc = fstat(fd, &s);
  if (rc != 0) {
    throw_ioe(env, errno);
    goto cleanup;
  }

  size_t pw_buflen = get_pw_buflen();
  if ((pw_buf = malloc(pw_buflen)) == NULL) {
    THROW(env, "java/lang/OutOfMemoryError", "Couldn't allocate memory for pw buffer");
    goto cleanup;
  }

  // Grab username
  struct passwd pwd, *pwdp;
  while ((rc = getpwuid_r(s.st_uid, &pwd, pw_buf, pw_buflen, &pwdp)) != 0) {
    if (rc != ERANGE) {
      throw_ioe(env, rc);
      goto cleanup;
    }
    free(pw_buf);
    pw_buflen *= 2;
    if ((pw_buf = malloc(pw_buflen)) == NULL) {
      THROW(env, "java/lang/OutOfMemoryError", "Couldn't allocate memory for pw buffer");
      goto cleanup;
    }
  }
  assert(pwdp == &pwd);

  jstring jstr_username = (*env)->NewStringUTF(env, pwd.pw_name);
  if (jstr_username == NULL) goto cleanup;

  // Grab group
  struct group grp, *grpp;
  while ((rc = getgrgid_r(s.st_gid, &grp, pw_buf, pw_buflen, &grpp)) != 0) {
    if (rc != ERANGE) {
      throw_ioe(env, rc);
      goto cleanup;
    }
    free(pw_buf);
    pw_buflen *= 2;
    if ((pw_buf = malloc(pw_buflen)) == NULL) {
      THROW(env, "java/lang/OutOfMemoryError", "Couldn't allocate memory for pw buffer");
      goto cleanup;
    }
  }
  assert(grpp == &grp);

  jstring jstr_groupname = (*env)->NewStringUTF(env, grp.gr_name);
  PASS_EXCEPTIONS_GOTO(env, cleanup);

  // Construct result
  ret = (*env)->NewObject(env, stat_clazz, stat_ctor,
    jstr_username, jstr_groupname, s.st_mode);

cleanup:
  if (pw_buf != NULL) free(pw_buf);
  return ret;
}