#define MAXSIZE 2048
#define MAXINSIZE 1300 /* pioctl complains if data is larger than this */
#define VMSGSIZE 128 /* size of msg buf in volume hdr */
-#define MAXCELLCHARS 64
+#define CELL_MAXNAMELEN 256
#define MAXHOSTCHARS 64
static char space[MAXSIZE];
blob.out_size = MAXSIZE;
blob.out = space;
- code = pioctl(apath, VIOC_FILE_CELL_NAME, &blob, 1);
+ code = pioctl_utf8(apath, VIOC_FILE_CELL_NAME, &blob, 1);
if (code) {
if ((errno == EINVAL) || (errno == ENOENT))
return 0;
blob.out_size = MAXSIZE;
blob.out = space;
- code = pioctl(apath, VIOC_FILE_CELL_NAME, &blob, 1);
+ code = pioctl_utf8(apath, VIOC_FILE_CELL_NAME, &blob, 1);
if (code == 0)
- return !stricmp("Freelance.Local.Root",space);
+ return !cm_stricmp_utf8N("Freelance.Local.Root",space);
return 1; /* assume it is because it is more restrictive that way */
}
tp->nplus = tp->nminus = 0;
tp->pluslist = tp->minuslist = 0;
tp->dfs = 0;
- sscanf(astr, "%d dfs:%d %s", &junk, &tp->dfs, tp->cell);
+ if (astr == NULL || sscanf(astr, "%d dfs:%d %s", &junk, &tp->dfs, tp->cell) <= 0) {
+ tp->dfs = 0;
+ tp->cell[0] = '\0';
+ }
return tp;
}
static struct Acl *
ParseAcl (char *astr)
{
- int nplus, nminus, i, trights;
+ int nplus, nminus, i, trights, ret;
char tname[MAXNAME];
- struct AclEntry *first, *last, *tl;
+ struct AclEntry *first, *next, *last, *tl;
struct Acl *ta;
- ta = (struct Acl *) malloc (sizeof (struct Acl));
- assert(ta);
- ta->dfs = 0;
- sscanf(astr, "%d dfs:%d %s", &ta->nplus, &ta->dfs, ta->cell);
+ ta = EmptyAcl(NULL);
+ if (astr == NULL || strlen(astr) == 0)
+ return ta;
+
+ ret = sscanf(astr, "%d dfs:%d %s", &ta->nplus, &ta->dfs, ta->cell);
+ if (ret <= 0) {
+ free(ta);
+ return NULL;
+ }
astr = SkipLine(astr);
- sscanf(astr, "%d", &ta->nminus);
+ ret = sscanf(astr, "%d", &ta->nminus);
+ if (ret <= 0) {
+ free(ta);
+ return NULL;
+ }
astr = SkipLine(astr);
nplus = ta->nplus;
last = 0;
first = 0;
for(i=0;i<nplus;i++) {
- sscanf(astr, "%100s %d", tname, &trights);
+ ret = sscanf(astr, "%100s %d", tname, &trights);
+ if (ret <= 0)
+ goto nplus_err;
astr = SkipLine(astr);
tl = (struct AclEntry *) malloc(sizeof (struct AclEntry));
- assert(tl);
+ if (tl == NULL)
+ goto nplus_err;
if (!first)
first = tl;
strcpy(tl->name, tname);
last = 0;
first = 0;
for(i=0;i<nminus;i++) {
- sscanf(astr, "%100s %d", tname, &trights);
+ ret = sscanf(astr, "%100s %d", tname, &trights);
+ if (ret <= 0)
+ goto nminus_err;
astr = SkipLine(astr);
tl = (struct AclEntry *) malloc(sizeof (struct AclEntry));
- assert(tl);
+ if (tl == NULL)
+ goto nminus_err;
if (!first)
first = tl;
strcpy(tl->name, tname);
ta->minuslist = first;
return ta;
+
+ nminus_err:
+ for (;first; first = next) {
+ next = first->next;
+ free(first);
+ }
+ first = ta->pluslist;
+
+ nplus_err:
+ for (;first; first = next) {
+ next = first->next;
+ free(first);
+ }
+ free(ta);
+ return NULL;
}
static int
DWORD enabled = 0;
code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,
- 0, KEY_QUERY_VALUE, &parmKey);
+ 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey);
if (code == ERROR_SUCCESS) {
dummyLen = sizeof(cm_freelanceEnabled);
code = RegQueryValueEx(parmKey, "FreelanceClient", NULL, NULL,
DWORD enabled = 0;
code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,
- 0, KEY_QUERY_VALUE, &parmKey);
+ 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey);
if (code == ERROR_SUCCESS) {
dummyLen = sizeof(buffer);
code = RegQueryValueEx(parmKey, "NetbiosName", NULL, NULL,
blob.out_size = MAXSIZE;
blob.in_size = idf;
blob.in = blob.out = space;
- code = pioctl(ti->data, VIOCGETAL, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOCGETAL, &blob, 1);
if (code) {
Die(errno, ti->data);
error = 1;
if (ta)
ZapAcl(ta);
ta = ParseAcl(space);
+ if (!ta) {
+ fprintf(stderr,
+ "fs: %s: invalid acl data returned from VIOCGETAL\n",
+ ti->data);
+ error = 1;
+ continue;
+ }
if (!plusp && ta->dfs) {
fprintf(stderr,
"fs: %s: you may not use the -negative switch with DFS acl's.\n%s",
ta = EmptyAcl(space);
else
ta = ParseAcl(space);
+ if (!ta) {
+ fprintf(stderr,
+ "fs: %s: invalid acl data returned from VIOCGETAL\n",
+ ti->data);
+ error = 1;
+ continue;
+ }
CleanAcl(ta, ti->data);
for(ui=as->parms[1].items; ui; ui=ui->next->next) {
enum rtype rtype;
blob.in = AclToString(ta);
blob.out_size=0;
blob.in_size = 1+(long)strlen(blob.in);
- code = pioctl(ti->data, VIOCSETAL, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOCSETAL, &blob, 1);
if (code) {
if (errno == EINVAL) {
if (ta->dfs) {
blob.out_size = MAXSIZE;
blob.in_size = idf;
blob.in = blob.out = space;
- code = pioctl(as->parms[0].items->data, VIOCGETAL, &blob, 1);
+ code = pioctl_utf8(as->parms[0].items->data, VIOCGETAL, &blob, 1);
if (code) {
Die(errno, as->parms[0].items->data);
return 1;
}
fa = ParseAcl(space);
+ if (!fa) {
+ fprintf(stderr,
+ "fs: %s: invalid acl data returned from VIOCGETAL\n",
+ as->parms[0].items->data);
+ return 1;
+ }
CleanAcl(fa, as->parms[0].items->data);
for (ti=as->parms[1].items; ti;ti=ti->next) {
blob.out_size = MAXSIZE;
blob.in_size = idf;
blob.in = blob.out = space;
- code = pioctl(ti->data, VIOCGETAL, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOCGETAL, &blob, 1);
if (code) {
Die(errno, ti->data);
error = 1;
ta = EmptyAcl(space);
else
ta = ParseAcl(space);
+ if (!ta) {
+ fprintf(stderr,
+ "fs: %s: invalid acl data returned from VIOCGETAL\n",
+ ti->data);
+ error = 1;
+ continue;
+ }
CleanAcl(ta, ti->data);
if (ta->dfs != fa->dfs) {
fprintf(stderr,
blob.in = AclToString(ta);
blob.out_size=0;
blob.in_size = 1+(long)strlen(blob.in);
- code = pioctl(ti->data, VIOCSETAL, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOCSETAL, &blob, 1);
if (code) {
if (errno == EINVAL) {
fprintf(stderr,
return error;
}
-/* pioctl() call to get the cellname of a pathname */
+/* pioctl_utf8() call to get the cellname of a pathname */
static afs_int32
GetCell(char *fname, char *cellname)
{
struct ViceIoctl blob;
blob.in_size = 0;
- blob.out_size = MAXCELLCHARS;
+ blob.out_size = CELL_MAXNAMELEN;
blob.out = cellname;
- code = pioctl(fname, VIOC_FILE_CELL_NAME, &blob, 1);
+ code = pioctl_utf8(fname, VIOC_FILE_CELL_NAME, &blob, 1);
return code;
}
{
afs_int32 tc, code, id;
char *nm;
- char cell[MAXCELLCHARS];
+ char cell[CELL_MAXNAMELEN];
+ char confDir[257];
for ( nm = aname; tc = *nm; nm++) {
/* all must be '-' or digit to be bad */
if (code)
return 0;
- pr_Initialize(1, AFSDIR_CLIENT_ETC_DIRPATH, cell);
+ cm_GetConfigDir(confDir, sizeof(confDir));
+
+ pr_Initialize(1, confDir, cell);
code = pr_SNameToId(aname, &id);
pr_End();
blob.out_size = MAXSIZE;
blob.in_size = 0;
blob.out = space;
- code = pioctl(ti->data, VIOCGETAL, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOCGETAL, &blob, 1);
if (code) {
Die(errno, ti->data);
error = 1;
if (ta)
ZapAcl(ta);
ta = ParseAcl(space);
-
+ if (!ta) {
+ fprintf(stderr,
+ "fs: %s: invalid acl data returned from VIOCGETAL\n",
+ ti->data);
+ error = 1;
+ continue;
+ }
if (ta->dfs) {
fprintf(stderr,
"%s: cleanacl is not supported for DFS access lists.\n",
blob.in=AclToString(ta);
blob.in_size = (long)strlen(blob.in)+1;
blob.out_size = 0;
- code = pioctl(ti->data, VIOCSETAL, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOCSETAL, &blob, 1);
if (code) {
if (errno == EINVAL) {
fprintf(stderr,
blob.out_size = MAXSIZE;
blob.in_size = idf;
blob.in = blob.out = space;
- code = pioctl(ti->data, VIOCGETAL, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOCGETAL, &blob, 1);
if (code) {
Die(errno, ti->data);
error = 1;
continue;
}
ta = ParseAcl(space);
+ if (!ta) {
+ fprintf(stderr,
+ "fs: %s: invalid acl data returned from VIOCGETAL\n",
+ ti->data);
+ error = 1;
+ continue;
+ }
switch (ta->dfs) {
case 0:
printf("Access list for %s is\n", ti->data);
struct ViceIoctl blob;
blob.in_size = blob.out_size = 0;
- code = pioctl(NULL, VIOC_FLUSHALL, &blob, 0);
+ code = pioctl_utf8(NULL, VIOC_FLUSHALL, &blob, 0);
if (code) {
fprintf(stderr, "Error flushing all ");
return 1;
SetDotDefault(&as->parms[0].items);
for(ti=as->parms[0].items; ti; ti=ti->next) {
blob.in_size = blob.out_size = 0;
- code = pioctl(ti->data, VIOC_FLUSHVOLUME, &blob, 0);
+ code = pioctl_utf8(ti->data, VIOC_FLUSHVOLUME, &blob, 0);
if (code) {
fprintf(stderr, "Error flushing volume ");
perror(ti->data);
blob.in = &options;
blob.out_size = 0;
- code = pioctl(ti->data, VIOCFLUSH, &blob, 0);
+ code = pioctl_utf8(ti->data, VIOCFLUSH, &blob, 0);
if (code) {
if (errno == EMFILE) {
fprintf(stderr, "%s: Can't flush active file %s\n", pn,
input += strlen(motd) + 1;
} else
*(input++) = '\0';
- code = pioctl(ti->data,VIOCSETVOLSTAT, &blob, 1);
+ code = pioctl_utf8(ti->data,VIOCSETVOLSTAT, &blob, 1);
if (code) {
Die(errno, ti->data);
error = 1;
cm_fid_t fid;
afs_uint32 filetype;
afs_uint32 owner[2];
- char cell[MAXCELLCHARS];
+ char cell[CELL_MAXNAMELEN];
/* once per file */
memset(&fid, 0, sizeof(fid));
blob.out_size = sizeof(cm_fid_t);
blob.out = (char *) &fid;
- if (0 == pioctl(ti->data, VIOCGETFID, &blob, 1)) {
+ if (0 == pioctl_utf8(ti->data, VIOCGETFID, &blob, 1)) {
options.field_flags |= CM_IOCTL_QOPTS_FIELD_FID;
options.fid = fid;
} else {
blob.out_size = sizeof(filetype);
blob.out = &filetype;
- code = pioctl(ti->data, VIOC_GETFILETYPE, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOC_GETFILETYPE, &blob, 1);
- blob.out_size = MAXCELLCHARS;
+ blob.out_size = CELL_MAXNAMELEN;
blob.out = cell;
- code = pioctl(ti->data, VIOC_FILE_CELL_NAME, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOC_FILE_CELL_NAME, &blob, 1);
printf("%s %s (%u.%u.%u) contained in cell %s\n",
filetypestr(filetype),
ti->data, fid.volume, fid.vnode, fid.unique,
blob.out_size = 2 * sizeof(afs_uint32);
blob.out = (char *) &owner;
- if (0 == pioctl(ti->data, VIOCGETOWNER, &blob, 1)) {
+ if (0 == pioctl_utf8(ti->data, VIOCGETOWNER, &blob, 1)) {
char oname[PR_MAXNAMELEN] = "(unknown)";
+ char confDir[257];
/* Go to the PRDB and see if this all number username is valid */
- pr_Initialize(1, AFSDIR_CLIENT_ETC_DIRPATH, cell);
+ cm_GetConfigDir(confDir, sizeof(confDir));
+
+ pr_Initialize(1, confDir, cell);
pr_SIdToName(owner[0], oname);
printf("Owner %s (%u) Group %u\n", oname, owner[0], owner[1]);
}
blob.out = space;
blob.out_size = MAXSIZE;
- code = pioctl(ti->data, VIOCGETVOLSTAT, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOCGETVOLSTAT, &blob, 1);
if (code == 0) {
status = (VolumeStatus *)space;
name = (char *)status + sizeof(*status);
}
errno = 0;
- code = pioctl(ti->data, VIOC_PATH_AVAILABILITY, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOC_PATH_AVAILABILITY, &blob, 1);
switch (errno) {
case 0:
printf("Volume is online\n");
blob.out_size = MAXSIZE;
blob.in_size = 0;
blob.out = space;
- code = pioctl(ti->data, VIOCGETVOLSTAT, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOCGETVOLSTAT, &blob, 1);
if (code) {
Die(errno, ti->data);
error = 1;
blob.out_size = sizeof(cm_fid_t);
blob.out = (char *) &fid;
- if (0 == pioctl(ti->data, VIOCGETFID, &blob, 1)) {
+ if (0 == pioctl_utf8(ti->data, VIOCGETFID, &blob, 1)) {
options.field_flags |= CM_IOCTL_QOPTS_FIELD_FID;
options.fid = fid;
} else {
blob.out_size = sizeof(filetype);
blob.out = &filetype;
- code = pioctl(ti->data, VIOC_GETFILETYPE, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOC_GETFILETYPE, &blob, 1);
blob.out_size = MAXSIZE;
blob.out = space;
memset(space, 0, sizeof(space));
- code = pioctl(ti->data, VIOCWHEREIS, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOCWHEREIS, &blob, 1);
if (code) {
Die(errno, ti->data);
error = 1;
blob.out_size = MAXSIZE;
blob.in_size = 0;
blob.out = space;
- code = pioctl(ti->data, VIOCGETVOLSTAT, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOCGETVOLSTAT, &blob, 1);
if (code) {
Die(errno, ti->data);
error = 1;
blob.out_size = MAXSIZE;
blob.in_size = 0;
blob.out = space;
- code = pioctl(ti->data, VIOCGETVOLSTAT, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOCGETVOLSTAT, &blob, 1);
if (code) {
Die(errno, ti->data);
error = 1;
blob.out = space;
memset(space, 0, MAXSIZE);
- code = pioctl(parent_dir, VIOC_AFS_STAT_MT_PT, &blob, 1);
+ code = pioctl_utf8(parent_dir, VIOC_AFS_STAT_MT_PT, &blob, 1);
if (code == 0) {
printf("'%s' is a %smount point for volume '%s'\n",
blob.in_size = 0;
blob.out_size = sizeof(localCellName);
blob.out = localCellName;
- code = pioctl(parent, VIOC_GET_WS_CELL, &blob, 1);
+ code = pioctl_utf8(parent, VIOC_GET_WS_CELL, &blob, 1);
if (!code)
cellName = localCellName;
}
blob.in_size = 1 + (long)strlen(space);
blob.in = space;
blob.out = NULL;
- code = pioctl(path, VIOC_AFS_CREATE_MT_PT, &blob, 0);
+ code = pioctl_utf8(path, VIOC_AFS_CREATE_MT_PT, &blob, 0);
#else /* not WIN32 */
code = symlink(space, path);
#endif /* not WIN32 */
blob.in_size = (long)strlen(tp)+1;
blob.out = lsbuffer;
blob.out_size = sizeof(lsbuffer);
- code = pioctl(tbuffer, VIOC_AFS_STAT_MT_PT, &blob, 0);
+ code = pioctl_utf8(tbuffer, VIOC_AFS_STAT_MT_PT, &blob, 0);
if (code) {
if (errno == EINVAL) {
fprintf(stderr,"%s: '%s' is not a mount point.\n", pn, ti->data);
blob.out_size = 0;
blob.in = tp;
blob.in_size = (long)strlen(tp)+1;
- code = pioctl(tbuffer, VIOC_AFS_DELETE_MT_PT, &blob, 0);
+ code = pioctl_utf8(tbuffer, VIOC_AFS_DELETE_MT_PT, &blob, 0);
if (code) {
Die(errno, ti->data);
error = 1;
#endif /* WIN32 */
}
- code = pioctl(0, VIOCCKSERV, &blob, 1);
+ code = pioctl_utf8(0, VIOCCKSERV, &blob, 1);
if (code) {
if ((errno == EACCES) && (checkserv.tinterval > 0)) {
printf("Must be root to change -interval\n");
if (code)
return 1;
- code = pioctl(0, VIOC_GAG, &blob, 1);
+ code = pioctl_utf8(0, VIOC_GAG, &blob, 1);
if (code) {
Die(errno, 0);
return 1;
blob.in_size = 0;
blob.out_size = 0;
- code = pioctl(0, VIOCCKBACK, &blob, 1);
+ code = pioctl_utf8(0, VIOCCKBACK, &blob, 1);
if (code) {
Die(errno, 0);
return 1;
blob.in = (char *) &temp;
blob.in_size = sizeof(afs_int32);
blob.out_size = 0;
- code = pioctl(0, VIOCSETCACHESIZE, &blob, 1);
+ code = pioctl_utf8(0, VIOCSETCACHESIZE, &blob, 1);
if (code) {
Die(errno, (char *) 0);
return 1;
blob.in_size = 0;
blob.out_size = sizeof(parms);
blob.out = (char *) &parms;
- code = pioctl(0, VIOCGETCACHEPARMS, &blob, 1);
+ code = pioctl_utf8(0, VIOCGETCACHEPARMS, &blob, 1);
if (code) {
Die(errno, NULL);
return 1;
blob.in_size = sizeof(afs_int32);
blob.in = space;
blob.out = space;
- code = pioctl(0, VIOCGETCELL, &blob, 1);
+ code = pioctl_utf8(0, VIOCGETCELL, &blob, 1);
if (code < 0) {
if (errno == EDOM)
break; /* done with the list */
blob.in_size = sizeof(afs_int32);
blob.in = space;
blob.out = space;
- code = pioctl(0, VIOC_GETALIAS, &blob, 1);
+ code = pioctl_utf8(0, VIOC_GETALIAS, &blob, 1);
if (code < 0) {
if (errno == EDOM)
break; /* done with the list */
blob.in = (char *) &hostAddr;
blob.out = (char *) &hostAddr;
- code = pioctl(0, VIOC_CBADDR, &blob, 1);
+ code = pioctl_utf8(0, VIOC_CBADDR, &blob, 1);
if (code < 0) {
Die(errno, 0);
return 1;
blob.in_size = size;
blob.in = space;
blob.out_size = 0;
- code = pioctl(0, VIOCNEWCELL, &blob, 1);
+ code = pioctl_utf8(0, VIOCNEWCELL, &blob, 1);
if (code < 0)
Die(errno, 0);
return 0;
blob.out_size = MAXSIZE;
blob.out = space;
- code = pioctl((char *) 0, VIOCNEWCELL, &blob, 1);
+ code = pioctl_utf8((char *) 0, VIOCNEWCELL, &blob, 1);
if (code) {
Die(errno, (char *) 0);
blob.in = space;
blob.out_size = 0;
blob.out = space;
- code = pioctl(0, VIOC_NEWALIAS, &blob, 1);
+ code = pioctl_utf8(0, VIOC_NEWALIAS, &blob, 1);
if (code < 0) {
if (errno == EEXIST) {
fprintf(stderr,
for(ti=as->parms[0].items; ti; ti=ti->next) {
cm_fid_t fid;
afs_uint32 filetype;
- char cell[MAXCELLCHARS];
+ char cell[CELL_MAXNAMELEN];
/* once per file */
memset(&fid, 0, sizeof(fid));
blob.out_size = sizeof(cm_fid_t);
blob.out = (char *) &fid;
- if (0 == pioctl(ti->data, VIOCGETFID, &blob, 1)) {
+ if (0 == pioctl_utf8(ti->data, VIOCGETFID, &blob, 1)) {
options.field_flags |= CM_IOCTL_QOPTS_FIELD_FID;
options.fid = fid;
} else {
blob.out_size = sizeof(filetype);
blob.out = &filetype;
- code = pioctl(ti->data, VIOC_GETFILETYPE, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOC_GETFILETYPE, &blob, 1);
- blob.out_size = MAXCELLCHARS;
+ blob.out_size = CELL_MAXNAMELEN;
blob.out = cell;
- code = pioctl(ti->data, VIOC_FILE_CELL_NAME, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOC_FILE_CELL_NAME, &blob, 1);
if (code) {
if (errno == ENOENT)
fprintf(stderr,"%s: no such cell as '%s'\n", pn, ti->data);
blob.out_size = MAXSIZE;
blob.out = space;
- code = pioctl(NULL, VIOC_GET_WS_CELL, &blob, 1);
+ code = pioctl_utf8(NULL, VIOC_GET_WS_CELL, &blob, 1);
if (code) {
Die(errno, NULL);
blob.out_size = sizeof(afs_int32);
blob.in = (char *) &hostAddr;
blob.out = (char *) &hostAddr;
- code = pioctl(0, VIOC_AFS_MARINER_HOST, &blob, 1);
+ code = pioctl_utf8(0, VIOC_AFS_MARINER_HOST, &blob, 1);
if (code) {
Die(errno, 0);
return 1;
*(input++) = '\0';
}
memcpy(space, &setp, sizeof(afs_int32));
- code = pioctl(0, VIOC_AFS_SYSNAME, &blob, 1);
+ code = pioctl_utf8(0, VIOC_AFS_SYSNAME, &blob, 1);
if (code) {
Die(errno, 0);
return 1;
blob.in_size = sizeof(afs_int32);
blob.out = (char *) &exportcall;
blob.out_size = sizeof(afs_int32);
- code = pioctl(0, VIOC_EXPORTAFS, &blob, 1);
+ code = pioctl_utf8(0, VIOC_EXPORTAFS, &blob, 1);
if (code) {
if (errno == ENODEV) {
fprintf(stderr,
}
blob.in_size = 1+(long)strlen(info.name);
blob.in = info.name;
- code = pioctl(0, VIOC_GETCELLSTATUS, &blob, 1);
+ code = pioctl_utf8(0, VIOC_GETCELLSTATUS, &blob, 1);
if (code) {
if (errno == ENOENT)
fprintf(stderr,"%s: the cell named '%s' does not exist\n", pn, info.name);
blob.in = (caddr_t) &args;
blob.out_size = 0;
blob.out = (caddr_t) 0;
- code = pioctl(0, VIOC_SETCELLSTATUS, &blob, 1);
+ code = pioctl_utf8(0, VIOC_SETCELLSTATUS, &blob, 1);
if (code) {
Die(errno, info.name); /* XXX added cell name to Die() call */
error = 1;
return error;
}
-#ifdef WIN32
static int
GetCellName(char *cellNamep, struct afsconf_cell *infop)
{
strcpy(infop->name, cellNamep);
return 0;
}
-#else
-static int
-GetCellName(char *cellName, struct afsconf_cell *info)
-{
- struct afsconf_dir *tdir;
- int code;
-
- tdir = afsconf_Open(AFSDIR_CLIENT_ETC_CLIENTNAME);
- if (!tdir) {
- fprintf(stderr,
- "Could not process files in configuration directory (%s).\n",
- AFSDIR_CLIENT_ETC_CLIENTNAME);
- return -1;
- }
-
- code = afsconf_GetCellInfo(tdir, cellName, AFSCONF_VLDBSERVICE, info);
- if (code) {
- fprintf(stderr,"fs: cell %s not in %s/CellServDB\n", cellName,
- AFSDIR_CLIENT_ETC_CLIENTNAME);
- return code;
- }
-
- return 0;
-}
-#endif /* not WIN32 */
static int
VLDBInit(int noAuthFlag, struct afsconf_cell *info)
{
afs_int32 code;
+ char confDir[257];
+
+ cm_GetConfigDir(confDir, sizeof(confDir));
- code = ugen_ClientInit(noAuthFlag, (char *)AFSDIR_CLIENT_ETC_DIRPATH,
+ code = ugen_ClientInit(noAuthFlag, confDir,
info->name, 0, &uclient,
NULL, pn, rxkad_clear,
VLDB_MAXSERVERS, AFSCONF_VLDBSERVICE, 50,
{
int code;
cm_SSetPref_t *ssp;
- code = pioctl(0, VIOC_SETSPREFS, &gblob, 1);
+ code = pioctl_utf8(0, VIOC_SETSPREFS, &gblob, 1);
ssp = (cm_SSetPref_t *)space;
gblob.in_size = (long)(((char *)&(ssp->servers[0])) - (char *)ssp);
{
int code;
- code = pioctl(0, VIOC_SETSPREFS, &gblob, 1);
+ code = pioctl_utf8(0, VIOC_SETSPREFS, &gblob, 1);
if (code && (errno == EINVAL)) {
struct setspref *ssp;
ssp = (struct setspref *)gblob.in;
if (!(ssp->flags & DBservers)) {
gblob.in = (void *)&(ssp->servers[0]);
gblob.in_size -= ((char *)&(ssp->servers[0])) - (char *)ssp;
- code = pioctl(0, VIOC_SETSPREFS33, &gblob, 1);
+ code = pioctl_utf8(0, VIOC_SETSPREFS33, &gblob, 1);
return code ? errno : 0;
}
fprintf(stderr,
in->num_servers = (MAXSIZE - 2*sizeof(short))/sizeof(struct cm_SPref);
in->flags = vlservers;
- code = pioctl(0, VIOC_GETSPREFS, &blob, 1);
+ code = pioctl_utf8(0, VIOC_GETSPREFS, &blob, 1);
if (code){
perror("getserverprefs pioctl");
Die (errno,0);
(MAXSIZE - 2 * sizeof(short)) / sizeof(struct spref);
in->flags = vlservers;
- code = pioctl(0, VIOC_GETSPREFS, &blob, 1);
+ code = pioctl_utf8(0, VIOC_GETSPREFS, &blob, 1);
if (code) {
perror("getserverprefs pioctl");
return 1;
}
#endif /* WIN32 */
+static afs_int32
+SmbUnicodeCmd(struct cmd_syndesc * asp, void * arock)
+{
+ long inValue = 0;
+ long outValue = 0;
+ long code;
+
+ struct ViceIoctl blob;
+
+ if (asp->parms[0].items) {
+ /* On */
+
+ inValue = 3;
+ } else if (asp->parms[1].items) {
+ /* Off */
+
+ inValue = 2;
+ }
+
+ if (inValue != 0 && !IsAdmin()) {
+ fprintf (stderr, "Permission denied: Requires AFS Client Administrator access.\n");
+ return EACCES;
+ }
+
+ blob.in_size = sizeof(inValue);
+ blob.in = (char *) &inValue;
+ blob.out_size = sizeof(outValue);
+ blob.out = (char *) &outValue;
+
+ code = pioctl_utf8(NULL, VIOC_UNICODECTL, &blob, 1);
+ if (code) {
+ Die(errno, NULL);
+ return code;
+ }
+
+ if (outValue != 2) {
+ printf("Unicode support is %s%s.\n",
+ ((outValue != 0)? "enabled":"disabled"),
+ ((inValue != 0)? " for new SMB connections":""));
+ } else {
+ printf("Unicode support is absent in this installation of OpenAFS.\n");
+ }
+
+ return 0;
+}
+
static int
UuidCmd(struct cmd_syndesc *asp, void *arock)
{
blob.out_size = sizeof(outValue);
blob.out = (char *) &outValue;
- code = pioctl(NULL, VIOC_UUIDCTL, &blob, 1);
+ code = pioctl_utf8(NULL, VIOC_UUIDCTL, &blob, 1);
if (code) {
Die(errno, NULL);
return code;
blob.out_size = sizeof(long);
blob.out = (char *) &outValue;
- code = pioctl(NULL, VIOC_TRACECTL, &blob, 1);
+ code = pioctl_utf8(NULL, VIOC_TRACECTL, &blob, 1);
if (code) {
Die(errno, NULL);
return code;
/* once per -file */
for (ti = as->parms[1].items; ti; ti = ti->next) {
/* Do this solely to see if the file is there */
- code = pioctl(ti->data, VIOCWHEREIS, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOCWHEREIS, &blob, 1);
if (code) {
Die(errno, ti->data);
error = 1;
continue;
}
- code = pioctl(ti->data, VIOC_STOREBEHIND, &blob, 1);
+ code = pioctl_utf8(ti->data, VIOC_STOREBEHIND, &blob, 1);
if (code) {
Die(errno, ti->data);
error = 1;
*/
if (!as->parms[1].items || (allfiles != -1)) {
tsb.sb_default = allfiles;
- code = pioctl(0, VIOC_STOREBEHIND, &blob, 1);
+ code = pioctl_utf8(0, VIOC_STOREBEHIND, &blob, 1);
if (code) {
Die(errno, ((allfiles == -1) ? 0 : "-allfiles"));
error = 1;
blob.in = (char *) &flag;
blob.in_size = sizeof(flag);
blob.out_size = 0;
- code = pioctl(0, VIOC_SETRXKCRYPT, &blob, 1);
+ code = pioctl_utf8(0, VIOC_SETRXKCRYPT, &blob, 1);
if (code)
Die(code, NULL);
return 0;
blob.out_size = sizeof(flag);
blob.out = space;
- code = pioctl(0, VIOC_GETRXKCRYPT, &blob, 1);
+ code = pioctl_utf8(0, VIOC_GETRXKCRYPT, &blob, 1);
if (code)
Die(code, NULL);
blob.out_size = sizeof(long);
blob.out = (char *) &outValue;
- code = pioctl(NULL, VIOC_TRACEMEMDUMP, &blob, 1);
+ code = pioctl_utf8(NULL, VIOC_TRACEMEMDUMP, &blob, 1);
if (code) {
Die(errno, NULL);
return code;
0,
"AFS",
REG_OPTION_NON_VOLATILE,
- KEY_WRITE,
+ (IsWow64()?KEY_WOW64_64KEY:0)|KEY_WRITE,
NULL,
&hkCSCPolicy,
NULL );
0,
"AFS",
REG_OPTION_NON_VOLATILE,
- KEY_READ|KEY_QUERY_VALUE,
+ (IsWow64()?KEY_WOW64_64KEY:0)|KEY_READ|KEY_QUERY_VALUE,
NULL,
&hkCSCPolicy,
NULL );
in->num_servers =
(MAXSIZE - 2 * sizeof(short)) / sizeof(struct spref);
/* returns addr in network byte order */
- code = pioctl(0, VIOC_GETCPREFS, &blob, 1);
+ code = pioctl_utf8(0, VIOC_GETCPREFS, &blob, 1);
if (code) {
perror("getClientInterfaceAddr pioctl");
return 1;
}
blob.in_size = sizeUsed - sizeof(struct spref);
- code = pioctl(0, VIOC_SETCPREFS, &blob, 1); /* network order */
+ code = pioctl_utf8(0, VIOC_SETCPREFS, &blob, 1); /* network order */
if (code) {
Die(errno, 0);
error = 1;
blob.out_size = 0;
memset(space, 0, MAXSIZE);
- code = pioctl(parent_dir, VIOC_AFS_FLUSHMOUNT, &blob, 1);
+ code = pioctl_utf8(parent_dir, VIOC_AFS_FLUSHMOUNT, &blob, 1);
if (code != 0) {
if (errno == EINVAL) {
blob.in_size = sizeof(afs_int32);
blob.out_size = 0;
- code = pioctl(NULL, VIOC_RXSTAT_PROC, &blob, 1);
+ code = pioctl_utf8(NULL, VIOC_RXSTAT_PROC, &blob, 1);
if (code != 0) {
Die(errno, NULL);
return 1;
blob.in_size = sizeof(afs_int32);
blob.out_size = 0;
- code = pioctl(NULL, VIOC_RXSTAT_PEER, &blob, 1);
+ code = pioctl_utf8(NULL, VIOC_RXSTAT_PEER, &blob, 1);
if (code != 0) {
Die(errno, NULL);
return 1;
blob.in_size = sizeof(test);
blob.out_size = 0;
- code = pioctl(NULL, VIOC_VOLSTAT_TEST, &blob, 1);
+ code = pioctl_utf8(NULL, VIOC_VOLSTAT_TEST, &blob, 1);
if (code != 0) {
Die(errno, NULL);
return 1;
#include "AFS_component_version_number.c"
#endif
-main(int argc, char **argv)
+static void
+FreeUtf8CmdLine(int argc, char ** argv)
+{
+ int i;
+ for (i=0; i < argc; i++) {
+ if (argv[i])
+ free(argv[i]);
+ }
+ free(argv);
+}
+
+static char **
+MakeUtf8Cmdline(int argc, const wchar_t **wargv)
+{
+ char ** argv;
+ int i;
+
+ argv = calloc(argc, sizeof(argv[0]));
+ if (argv == NULL)
+ return NULL;
+
+ for (i=0; i < argc; i++) {
+ int s;
+
+ s = WideCharToMultiByte(CP_UTF8, 0, wargv[i], -1, NULL, 0, NULL, FALSE);
+ if (s == 0 ||
+ (argv[i] = calloc(s+1, sizeof(char))) == NULL) {
+ break;
+ }
+
+ s = WideCharToMultiByte(CP_UTF8, 0, wargv[i], -1, argv[i], s+1, NULL, FALSE);
+ if (s == 0) {
+ break;
+ }
+ }
+
+ if (i < argc) {
+ FreeUtf8CmdLine(argc, argv);
+ return NULL;
+ }
+
+ return argv;
+}
+
+int wmain(int argc, wchar_t **wargv)
{
afs_int32 code;
struct cmd_syndesc *ts;
+ char ** argv;
#ifdef AFS_AIX32_ENV
/*
WSAStartup(0x0101, &WSAjunk);
#endif /* WIN32 */
+ argv = MakeUtf8Cmdline(argc, wargv);
+
/* try to find volume location information */
osi_Init();
cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_OPTIONAL, "volume name or number");
cmd_AddParm(ts, "-state", CMD_SINGLE, CMD_OPTIONAL, "new volume state: online, busy, offline, down");
+ ts = cmd_CreateSyntax("smbunicode", SmbUnicodeCmd, NULL, "enable or disable Unicode on new SMB connections");
+ cmd_AddParm(ts, "-on", CMD_FLAG, CMD_OPTIONAL, "enable Unicode on new connections");
+ cmd_AddParm(ts, "-off", CMD_FLAG, CMD_OPTIONAL, "disable Unicode on new connections");
+
code = cmd_Dispatch(argc, argv);
if (rxInitDone)
rx_Finalize();
+ FreeUtf8CmdLine(argc, argv);
+
return code;
}