int DLL_DECL Cns_getusrbynam(char *username, uid_t *uid) { int c; char func[16]; int msglen; int n; char *q; char *rbp; char repbuf[256]; char *sbp; char sendbuf[REQBUFSZ]; struct Cns_api_thread_info *thip; strcpy (func, "Cns_getusrbynam"); if (Cns_apiinit (&thip)) return (-1); if (! username || ! uid) { serrno = EFAULT; return (-1); } /* Build request header */ sbp = sendbuf; marshall_LONG (sbp, CNS_MAGIC); marshall_LONG (sbp, CNS_GETUSRID); q = sbp; /* save pointer. The next field will be updated */ msglen = 3 * LONGSIZE; marshall_LONG (sbp, msglen); /* Build request body */ marshall_STRING (sbp, username); msglen = sbp - sendbuf; marshall_LONG (q, msglen); /* update length field */ c = send2nsd (NULL, NULL, sendbuf, msglen, repbuf, sizeof(repbuf)); if (c == 0) { rbp = repbuf; unmarshall_LONG (rbp, n); *uid = n; } return (c); }
int DLL_DECL dpm_put (int nbreqfiles, struct dpm_putfilereq *reqfiles, int nbprotocols, char **protocols, char *u_token, int overwrite, time_t retrytime, char *r_token, int *nbreplies, struct dpm_putfilestatus **filestatuses) { int c; char errstring[256]; char func[16]; gid_t gid; int i; int msglen; char *rbp; char repbuf[4+256+CA_MAXDPMTOKENLEN+1]; char *sbp; char *sendbuf; char surl[CA_MAXSFNLEN+1]; struct dpm_api_thread_info *thip; uid_t uid; strcpy (func, "dpm_put"); if (dpm_apiinit (&thip)) return (-1); uid = geteuid(); gid = getegid(); #if defined(_WIN32) if (uid < 0 || gid < 0) { dpm_errmsg (func, DP053); serrno = SENOMAPFND; return (-1); } #endif if (nbreqfiles <= 0 || nbprotocols <= 0) { serrno = EINVAL; return (-1); } if (! reqfiles || ! protocols || ! r_token || ! nbreplies || ! filestatuses) { serrno = EFAULT; return (-1); } /* Compute size of send buffer */ msglen = 6 * LONGSIZE; for (i = 0; i < nbprotocols; i++) msglen += strlen (protocols[i]) + 1; if (u_token) msglen += strlen (u_token) + 1; else msglen++; msglen += LONGSIZE; msglen += TIME_TSIZE; msglen += LONGSIZE; for (i = 0; i < nbreqfiles; i++) { msglen += strlen ((reqfiles+i)->to_surl) + 1; msglen += TIME_TSIZE; msglen++; msglen += strlen ((reqfiles+i)->s_token) + 1; msglen += HYPERSIZE; msglen += TIME_TSIZE; msglen++; msglen++; } /* Allocate send buffer */ if ((sendbuf = malloc (msglen)) == NULL) { serrno = ENOMEM; return (-1); } /* Build request header */ sbp = sendbuf; marshall_LONG (sbp, DPM_MAGIC2); marshall_LONG (sbp, DPM_PUT); marshall_LONG (sbp, msglen); /* Build request body */ marshall_LONG (sbp, uid); marshall_LONG (sbp, gid); marshall_LONG (sbp, nbprotocols); for (i = 0; i < nbprotocols; i++) marshall_STRING (sbp, protocols[i]); if (u_token) { marshall_STRING (sbp, u_token); } else { marshall_STRING (sbp, ""); } marshall_LONG (sbp, overwrite); marshall_TIME_T (sbp, retrytime); marshall_LONG (sbp, nbreqfiles); for (i = 0; i < nbreqfiles; i++) { marshall_STRING (sbp, (reqfiles+i)->to_surl); marshall_TIME_T (sbp, (reqfiles+i)->lifetime); marshall_BYTE (sbp, (reqfiles+i)->f_type); marshall_STRING (sbp, (reqfiles+i)->s_token); marshall_HYPER (sbp, (reqfiles+i)->requested_size); marshall_TIME_T (sbp, (reqfiles+i)->f_lifetime); marshall_BYTE (sbp, (reqfiles+i)->ret_policy); marshall_BYTE (sbp, (reqfiles+i)->ac_latency); } c = send2dpm (NULL, sendbuf, msglen, repbuf, sizeof(repbuf), (void **)filestatuses, nbreplies); free (sendbuf); if (c == 0) { rbp = repbuf; unmarshall_LONG (rbp, c); if ((c & 0xF000) == DPM_FAILED) { serrno = c - DPM_FAILED; c = -1; } unmarshall_STRING (rbp, errstring); if (*errstring) dpm_errmsg (func, "%s\n", errstring); unmarshall_STRING (rbp, r_token); } return (c); }
int DLL_DECL dpm_getreqsummary (int nbtokens, char **r_tokens, int *nbreplies, struct dpm_reqsummary **summaries) { int c; char errstring[256]; char func[18]; gid_t gid; int i; int msglen; char *rbp; char repbuf[4+256]; char *sbp; char *sendbuf; struct dpm_api_thread_info *thip; uid_t uid; strcpy (func, "dpm_getreqsummary"); if (dpm_apiinit (&thip)) return (-1); uid = geteuid(); gid = getegid(); #if defined(_WIN32) if (uid < 0 || gid < 0) { dpm_errmsg (func, DP053); serrno = SENOMAPFND; return (-1); } #endif if (nbtokens <= 0) { serrno = EINVAL; return (-1); } if (! r_tokens || ! nbreplies || ! summaries) { serrno = EFAULT; return (-1); } /* Compute size of send buffer */ msglen = 6 * LONGSIZE; for (i = 0; i < nbtokens; i++) { msglen += strlen (r_tokens[i]) + 1; } /* Allocate send buffer */ if ((sendbuf = malloc (msglen)) == NULL) { serrno = ENOMEM; return (-1); } /* Build request header */ sbp = sendbuf; marshall_LONG (sbp, DPM_MAGIC); marshall_LONG (sbp, DPM_GETREQSUM); marshall_LONG (sbp, msglen); /* Build request body */ marshall_LONG (sbp, uid); marshall_LONG (sbp, gid); marshall_LONG (sbp, nbtokens); for (i = 0; i < nbtokens; i++) { marshall_STRING (sbp, r_tokens[i]); } c = send2dpm (NULL, sendbuf, msglen, repbuf, sizeof(repbuf), (void **)summaries, nbreplies); free (sendbuf); if (c == 0) { rbp = repbuf; unmarshall_LONG (rbp, c); if (c) { serrno = c - DPM_FAILED; c = -1; } unmarshall_STRING (rbp, errstring); if (*errstring) dpm_errmsg (func, "%s\n", errstring); } return (c); }
int DLL_DECL dpm_abortreq (char *r_token) { int c; char errstring[256]; char func[16]; gid_t gid; int msglen; char *q; char *rbp; char repbuf[4+256]; char *sbp; char sendbuf[REQBUFSZ]; struct dpm_api_thread_info *thip; uid_t uid; strcpy (func, "dpm_abortreq"); if (dpm_apiinit (&thip)) return (-1); uid = geteuid(); gid = getegid(); #if defined(_WIN32) if (uid < 0 || gid < 0) { dpm_errmsg (func, DP053); serrno = SENOMAPFND; return (-1); } #endif if (! r_token) { serrno = EFAULT; return (-1); } /* Build request header */ sbp = sendbuf; marshall_LONG (sbp, DPM_MAGIC); marshall_LONG (sbp, DPM_ABORTREQ); q = sbp; /* save pointer. The next field will be updated */ msglen = 3 * LONGSIZE; marshall_LONG (sbp, msglen); /* Build request body */ marshall_LONG (sbp, uid); marshall_LONG (sbp, gid); marshall_STRING (sbp, r_token); msglen = sbp - sendbuf; marshall_LONG (q, msglen); /* update length field */ c = send2dpm (NULL, sendbuf, msglen, repbuf, sizeof(repbuf), NULL, NULL); if (c == 0) { rbp = repbuf; unmarshall_LONG (rbp, c); if (c) { serrno = c - DPM_FAILED; c = -1; } unmarshall_STRING (rbp, errstring); if (*errstring) dpm_errmsg (func, "%s\n", errstring); } return (c); }
int DLL_DECL Cns_getidmapc (const char *username, const char *user_ca, int nbgroups, const char **groupnames, uid_t *userid, gid_t *gids) { int c; char func[16]; int i; int msglen; int n; char *q; char *rbp; char repbuf[REPBUFSZ]; char *sbp; char *sendbuf; struct Cns_api_thread_info *thip; strcpy (func, "Cns_getidmap"); if (Cns_apiinit (&thip)) return (-1); if (! username || ! userid || ! gids) { serrno = EFAULT; return (-1); } if (nbgroups < 0) { serrno = EINVAL; return (-1); } /* Compute size of send buffer */ msglen = 3 * LONGSIZE; msglen += strlen (username) + 1; msglen += LONGSIZE; if (groupnames) { for (i = 0; i < nbgroups; i++) msglen += strlen (groupnames[i]) + 1; } if (user_ca) msglen += strlen (user_ca) + 1; else msglen++; /* Allocate send buffer */ if ((sendbuf = malloc (msglen)) == NULL) { serrno = ENOMEM; return (-1); } /* Build request header */ sbp = sendbuf; marshall_LONG (sbp, CNS_MAGIC2); marshall_LONG (sbp, CNS_GETIDMAP); q = sbp; /* save pointer. The next field will be updated */ msglen = 3 * LONGSIZE; marshall_LONG (sbp, msglen); /* Build request body */ marshall_STRING (sbp, username); marshall_LONG (sbp, nbgroups); if (groupnames) { for (i = 0; i < nbgroups; i++) { marshall_STRING (sbp, groupnames[i]); } } if (user_ca) { marshall_STRING (sbp, user_ca); } else { marshall_STRING (sbp, ""); } msglen = sbp - sendbuf; marshall_LONG (q, msglen); /* update length field */ c = send2nsd (NULL, NULL, sendbuf, msglen, repbuf, sizeof(repbuf)); free (sendbuf); if (c == 0) { rbp = repbuf; unmarshall_LONG (rbp, n); *userid = n; if (nbgroups == 0) nbgroups = 1; for (i = 0; i < nbgroups; i++) { unmarshall_LONG (rbp, n); *(gids+i) = n; } } return (c); }
int DLL_DECL Cns_delfilesbyguid(int nbguids, const char **guids, int force, int *nbstatuses, int **statuses) { int argtype = 0; int c; char func[19]; gid_t gid; int i; int msglen; char *q; char *rbp; char repbuf[4]; char *sbp; char *sendbuf; struct Cns_api_thread_info *thip; uid_t uid; strcpy (func, "Cns_delfilesbyguid"); if (Cns_apiinit (&thip)) return (-1); uid = geteuid(); gid = getegid(); #if defined(_WIN32) if (uid < 0 || gid < 0) { Cns_errmsg (func, NS053); serrno = SENOMAPFND; return (-1); } #endif if (nbguids <= 0) { serrno = EINVAL; return (-1); } if (! guids || ! nbstatuses || ! statuses) { serrno = EFAULT; return (-1); } /* Compute size of send buffer */ msglen = 5 * LONGSIZE; msglen += WORDSIZE; msglen += WORDSIZE; msglen += LONGSIZE; for (i = 0; i < nbguids; i++) { msglen += strlen (guids[i]) + 1; } /* Allocate send buffer */ if ((sendbuf = malloc (msglen)) == NULL) { serrno = ENOMEM; return (-1); } /* Build request header */ sbp = sendbuf; marshall_LONG (sbp, CNS_MAGIC); marshall_LONG (sbp, CNS_DELFILES); q = sbp; /* save pointer. The next field will be updated */ msglen = 3 * LONGSIZE; marshall_LONG (sbp, msglen); /* Build request body */ marshall_LONG (sbp, uid); marshall_LONG (sbp, gid); marshall_WORD (sbp, argtype); marshall_WORD (sbp, force); marshall_LONG (sbp, nbguids); for (i = 0; i < nbguids; i++) { marshall_STRING (sbp, guids[i]); } msglen = sbp - sendbuf; marshall_LONG (q, msglen); /* update length field */ c = send2nsdx (NULL, NULL, sendbuf, msglen, repbuf, sizeof(repbuf), (void **)statuses, nbstatuses); free (sendbuf); if (c == 0) { rbp = repbuf; unmarshall_LONG (rbp, *nbstatuses); if (*nbstatuses == 0) { *statuses = NULL; return (0); } } return (c); }
int DLL_DECL Cns_statr(const char *sfn, struct Cns_filestatg *statbuf) { int c, n; char func[16]; gid_t gid; int msglen; char *q; char *rbp; char repbuf[132]; char *sbp; char sendbuf[REQBUFSZ]; struct Cns_api_thread_info *thip; uid_t uid; strcpy (func, "Cns_statr"); if (Cns_apiinit (&thip)) return (-1); uid = geteuid(); gid = getegid(); #if defined(_WIN32) if (uid < 0 || gid < 0) { Cns_errmsg (func, NS053); serrno = SENOMAPFND; return (-1); } #endif if (! sfn || ! statbuf) { serrno = EFAULT; return (-1); } if (strlen (sfn) > CA_MAXSFNLEN) { serrno = ENAMETOOLONG; return (-1); } /* Build request header */ sbp = sendbuf; marshall_LONG (sbp, CNS_MAGIC); marshall_LONG (sbp, CNS_STATR); q = sbp; /* save pointer. The next field will be updated */ msglen = 3 * LONGSIZE; marshall_LONG (sbp, msglen); /* Build request body */ marshall_LONG (sbp, uid); marshall_LONG (sbp, gid); marshall_STRING (sbp, sfn); msglen = sbp - sendbuf; marshall_LONG (q, msglen); /* update length field */ c = send2nsd (NULL, NULL, sendbuf, msglen, repbuf, sizeof(repbuf)); if (c == 0) { rbp = repbuf; unmarshall_HYPER (rbp, statbuf->fileid); unmarshall_STRING (rbp, statbuf->guid); unmarshall_WORD (rbp, statbuf->filemode); unmarshall_LONG (rbp, statbuf->nlink); unmarshall_LONG (rbp, statbuf->uid); unmarshall_LONG (rbp, statbuf->gid); unmarshall_HYPER (rbp, statbuf->filesize); unmarshall_TIME_T (rbp, statbuf->atime); unmarshall_TIME_T (rbp, statbuf->mtime); unmarshall_TIME_T (rbp, statbuf->ctime); unmarshall_WORD (rbp, statbuf->fileclass); unmarshall_BYTE (rbp, statbuf->status); unmarshall_STRING (rbp, statbuf->csumtype); unmarshall_STRING (rbp, statbuf->csumvalue); } if (c && serrno == SENAMETOOLONG) serrno = ENAMETOOLONG; return (c); }
int DLL_DECL Cns_lstat(const char *path, struct Cns_filestat *statbuf) { char *actual_path; int c, n; char func[16]; gid_t gid; int msglen; char *q; char *rbp; char repbuf[57]; char *sbp; char sendbuf[REQBUFSZ]; char server[CA_MAXHOSTNAMELEN+1]; struct Cns_api_thread_info *thip; uid_t uid; u_signed64 zero = 0; strcpy (func, "Cns_lstat"); if (Cns_apiinit (&thip)) return (-1); uid = geteuid(); gid = getegid(); #if defined(_WIN32) if (uid < 0 || gid < 0) { Cns_errmsg (func, NS053); serrno = SENOMAPFND; return (-1); } #endif if (! path || ! statbuf) { serrno = EFAULT; return (-1); } if (strlen (path) > CA_MAXPATHLEN) { serrno = ENAMETOOLONG; return (-1); } if (Cns_selectsrvr (path, thip->server, server, &actual_path)) return (-1); /* Build request header */ sbp = sendbuf; marshall_LONG (sbp, CNS_MAGIC2); marshall_LONG (sbp, CNS_LSTAT); q = sbp; /* save pointer. The next field will be updated */ msglen = 3 * LONGSIZE; marshall_LONG (sbp, msglen); /* Build request body */ marshall_LONG (sbp, uid); marshall_LONG (sbp, gid); marshall_HYPER (sbp, thip->cwd); marshall_HYPER (sbp, zero); marshall_STRING (sbp, actual_path); msglen = sbp - sendbuf; marshall_LONG (q, msglen); /* update length field */ c = send2nsd (NULL, server, sendbuf, msglen, repbuf, sizeof(repbuf)); if (c == 0) { rbp = repbuf; unmarshall_HYPER (rbp, statbuf->fileid); unmarshall_WORD (rbp, statbuf->filemode); unmarshall_LONG (rbp, statbuf->nlink); unmarshall_LONG (rbp, statbuf->uid); unmarshall_LONG (rbp, statbuf->gid); unmarshall_HYPER (rbp, statbuf->filesize); unmarshall_TIME_T (rbp, statbuf->atime); unmarshall_TIME_T (rbp, statbuf->mtime); unmarshall_TIME_T (rbp, statbuf->ctime); unmarshall_WORD (rbp, statbuf->fileclass); unmarshall_BYTE (rbp, statbuf->status); } if (c && serrno == SENAMETOOLONG) serrno = ENAMETOOLONG; return (c); }
int DLL_DECL Cns_registerfiles(int nbfiles, struct Cns_filereg *files, int *nbstatuses, int **statuses) { int c; char func[18]; gid_t gid; int i; int msglen; char *q; char *rbp; char repbuf[4]; char *sbp; char *sendbuf; struct Cns_api_thread_info *thip; uid_t uid; strcpy (func, "Cns_registerfiles"); if (Cns_apiinit (&thip)) return (-1); uid = geteuid(); gid = getegid(); #if defined(_WIN32) if (uid < 0 || gid < 0) { Cns_errmsg (func, NS053); serrno = SENOMAPFND; return (-1); } #endif if (nbfiles <= 0) { serrno = EINVAL; return (-1); } if (! files || ! nbstatuses || ! statuses) { serrno = EFAULT; return (-1); } /* Compute size of send buffer */ msglen = 5 * LONGSIZE; msglen += WORDSIZE; msglen += HYPERSIZE; msglen += LONGSIZE; for (i = 0; i < nbfiles; i++) { msglen += strlen ((files+i)->lfn) + 1; if ((files+i)->guid) { msglen += strlen ((files+i)->guid) + 1; } else { msglen++; } msglen += LONGSIZE; msglen += HYPERSIZE; if ((files+i)->csumtype) { msglen += strlen ((files+i)->csumtype) + 1; } else { msglen++; } if ((files+i)->csumvalue) { msglen += strlen ((files+i)->csumvalue) + 1; } else { msglen++; } msglen += strlen ((files+i)->server) + 1; msglen += strlen ((files+i)->sfn) + 1; } /* Allocate send buffer */ if ((sendbuf = malloc (msglen)) == NULL) { serrno = ENOMEM; return (-1); } /* Build request header */ sbp = sendbuf; marshall_LONG (sbp, CNS_MAGIC); marshall_LONG (sbp, CNS_REGFILES); q = sbp; /* save pointer. The next field will be updated */ msglen = 3 * LONGSIZE; marshall_LONG (sbp, msglen); /* Build request body */ marshall_LONG (sbp, uid); marshall_LONG (sbp, gid); marshall_WORD (sbp, thip->mask); marshall_HYPER (sbp, thip->cwd); marshall_LONG (sbp, nbfiles); for (i = 0; i < nbfiles; i++) { marshall_STRING (sbp, (files+i)->lfn); if ((files+i)->guid) { marshall_STRING (sbp, (files+i)->guid); } else { marshall_STRING (sbp, ""); } marshall_LONG (sbp, (files+i)->mode); marshall_HYPER (sbp, (files+i)->size); if ((files+i)->guid) { marshall_STRING (sbp, (files+i)->csumtype); } else { marshall_STRING (sbp, ""); } if ((files+i)->guid) { marshall_STRING (sbp, (files+i)->csumvalue); } else { marshall_STRING (sbp, ""); } marshall_STRING (sbp, (files+i)->server); marshall_STRING (sbp, (files+i)->sfn); } msglen = sbp - sendbuf; marshall_LONG (q, msglen); /* update length field */ c = send2nsdx (NULL, NULL, sendbuf, msglen, repbuf, sizeof(repbuf), (void **)statuses, nbstatuses); free (sendbuf); if (c == 0) { rbp = repbuf; unmarshall_LONG (rbp, *nbstatuses); if (*nbstatuses == 0) { *statuses = NULL; return (0); } } return (c); }