本文整理汇总了C++中set_errno函数的典型用法代码示例。如果您正苦于以下问题:C++ set_errno函数的具体用法?C++ set_errno怎么用?C++ set_errno使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了set_errno函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: inet_pton
int inet_pton(int af, FAR const char *src, FAR void *dst)
{
#ifndef CONFIG_NET_IPv6
size_t srcoffset;
size_t numoffset;
int value;
int ndots;
uint8_t ch;
char numstr[4];
uint8_t *ip;
DEBUGASSERT(src && dst);
if (af != AF_INET)
{
set_errno(EAFNOSUPPORT);
return -1;
}
(void)memset(dst, 0, sizeof(struct in_addr));
ip = (uint8_t *)dst;
srcoffset = 0;
numoffset = 0;
ndots = 0;
for(;;)
{
ch = (uint8_t)src[srcoffset++];
if (ch == '.' || ch == '\0')
{
if (ch == '.' && ndots >= 4)
{
/* Too many dots */
break;
}
if (numoffset <= 0)
{
/* Empty numeric string */
break;
}
numstr[numoffset] = '\0';
numoffset = 0;
value = atoi(numstr);
if (value < 0 || value > 255)
{
/* Out of range value */
break;
}
ip[ndots] = (uint8_t)value;
if (ch == '\0')
{
if (ndots != 3)
{
/* Not enough dots */
break;
}
/* Return 1 if the conversion succeeds */
return 1;
}
ndots++;
}
else if (ch >= '0' && ch <= '9')
{
numstr[numoffset++] = ch;
if (numoffset >= 4)
{
/* Number is too long */
break;
}
}
else
{
/* Illegal character */
break;
}
}
/* Return zero if there is any problem parsing the input */
return 0;
#else
size_t srcoffset;
size_t numoffset;
long value;
//.........这里部分代码省略.........
示例2: TEST_BEGIN
TEST_END
TEST_BEGIN(test_malloc_strtoumax)
{
struct test_s {
const char *input;
const char *expected_remainder;
int base;
int expected_errno;
const char *expected_errno_name;
uintmax_t expected_x;
};
#define ERR(e) e, #e
#define UMAX(x) ((uintmax_t)x##ULL)
struct test_s tests[] = {
{"0", "0", -1, ERR(EINVAL), UINTMAX_MAX},
{"0", "0", 1, ERR(EINVAL), UINTMAX_MAX},
{"0", "0", 37, ERR(EINVAL), UINTMAX_MAX},
{"", "", 0, ERR(EINVAL), UINTMAX_MAX},
{"+", "+", 0, ERR(EINVAL), UINTMAX_MAX},
{"++3", "++3", 0, ERR(EINVAL), UINTMAX_MAX},
{"-", "-", 0, ERR(EINVAL), UINTMAX_MAX},
{"42", "", 0, ERR(0), UMAX(42)},
{"+42", "", 0, ERR(0), UMAX(42)},
{"-42", "", 0, ERR(0), UMAX(-42)},
{"042", "", 0, ERR(0), UMAX(042)},
{"+042", "", 0, ERR(0), UMAX(042)},
{"-042", "", 0, ERR(0), UMAX(-042)},
{"0x42", "", 0, ERR(0), UMAX(0x42)},
{"+0x42", "", 0, ERR(0), UMAX(0x42)},
{"-0x42", "", 0, ERR(0), UMAX(-0x42)},
{"0", "", 0, ERR(0), UMAX(0)},
{"1", "", 0, ERR(0), UMAX(1)},
{"42", "", 0, ERR(0), UMAX(42)},
{" 42", "", 0, ERR(0), UMAX(42)},
{"42 ", " ", 0, ERR(0), UMAX(42)},
{"0x", "x", 0, ERR(0), UMAX(0)},
{"42x", "x", 0, ERR(0), UMAX(42)},
{"07", "", 0, ERR(0), UMAX(7)},
{"010", "", 0, ERR(0), UMAX(8)},
{"08", "8", 0, ERR(0), UMAX(0)},
{"0_", "_", 0, ERR(0), UMAX(0)},
{"0x", "x", 0, ERR(0), UMAX(0)},
{"0X", "X", 0, ERR(0), UMAX(0)},
{"0xg", "xg", 0, ERR(0), UMAX(0)},
{"0XA", "", 0, ERR(0), UMAX(10)},
{"010", "", 10, ERR(0), UMAX(10)},
{"0x3", "x3", 10, ERR(0), UMAX(0)},
{"12", "2", 2, ERR(0), UMAX(1)},
{"78", "8", 8, ERR(0), UMAX(7)},
{"9a", "a", 10, ERR(0), UMAX(9)},
{"9A", "A", 10, ERR(0), UMAX(9)},
{"fg", "g", 16, ERR(0), UMAX(15)},
{"FG", "G", 16, ERR(0), UMAX(15)},
{"0xfg", "g", 16, ERR(0), UMAX(15)},
{"0XFG", "G", 16, ERR(0), UMAX(15)},
{"z_", "_", 36, ERR(0), UMAX(35)},
{"Z_", "_", 36, ERR(0), UMAX(35)}
};
#undef ERR
#undef UMAX
unsigned i;
for (i = 0; i < sizeof(tests)/sizeof(struct test_s); i++) {
struct test_s *test = &tests[i];
int err;
uintmax_t result;
char *remainder;
set_errno(0);
result = malloc_strtoumax(test->input, &remainder, test->base);
err = get_errno();
assert_d_eq(err, test->expected_errno,
"Expected errno %s for \"%s\", base %d",
test->expected_errno_name, test->input, test->base);
assert_str_eq(remainder, test->expected_remainder,
"Unexpected remainder for \"%s\", base %d",
test->input, test->base);
if (err == 0) {
assert_ju_eq(result, test->expected_x,
"Unexpected result for \"%s\", base %d",
test->input, test->base);
}
}
}
示例3: nxtk_drawlinewindow
int nxtk_drawlinewindow(NXTKWINDOW hfwnd, FAR struct nxgl_vector_s *vector,
nxgl_coord_t width, nxgl_mxpixel_t color[CONFIG_NX_NPLANES],
uint8_t caps)
{
struct nxgl_trapezoid_s trap[3];
struct nxgl_rect_s rect;
int ret;
#ifdef CONFIG_DEBUG
if (!hfwnd || !vector || width < 1 || !color)
{
set_errno(EINVAL);
return ERROR;
}
#endif
/* Split the line into trapezoids */
ret = nxgl_splitline(vector, trap, &rect, width);
switch (ret)
{
/* 0: Line successfully broken up into three trapezoids. Values in
* traps[0], traps[1], and traps[2] are valid.
*/
case 0:
ret = nxtk_filltrapwindow(hfwnd, &trap[0], color);
if (ret == OK)
{
ret = nxtk_filltrapwindow(hfwnd, &trap[1], color);
if (ret == OK)
{
ret = nxtk_filltrapwindow(hfwnd, &trap[2], color);
}
}
break;
/* 1: Line successfully represented by one trapezoid. Value in traps[1]
* is valid.
*/
case 1:
ret = nxtk_filltrapwindow(hfwnd, &trap[1], color);
break;
/* 2: Line successfully represented by one rectangle. Value in rect is
* valid
*/
case 2:
ret = nxtk_fillwindow(hfwnd, &rect, color);
break;
/* <0: On errors, a negated errno value is returned. */
default:
set_errno(EINVAL);
return ERROR;
}
/* Draw circular caps at each end of the line to support better line joins */
if (caps != NX_LINECAP_NONE && width >= 3)
{
nxgl_coord_t radius = width >> 1;
/* Draw a circle at pt1 */
ret = OK;
if ((caps & NX_LINECAP_PT1) != 0)
{
ret = nxtk_fillcirclewindow(hfwnd, &vector->pt1, radius, color);
}
/* Draw a circle at pt2 */
if (ret == OK && (caps & NX_LINECAP_PT2) != 0)
{
ret = nxtk_fillcirclewindow(hfwnd, &vector->pt2, radius, color);
}
}
示例4: SH7264_SMSC_open
RTP_BOOL SH7264_SMSC_open(PIFACE pi)
{
DWORD mac[2], dwCnt, dwReg, dw;
PSH7264_SMSC_SOFTC sc = iface_to_softc(pi);
if (!sc)
{
RTP_DEBUG_ERROR("SH7264_SMSC_open: softc invalid!\r\n", NOVAR, 0, 0);
set_errno(ENUMDEVICE);
return(RTP_FALSE);
}
// Set Interface
sc->iface = pi;
iface = pi;
//Setting port
PJCR0 |= 0x3300;
if (WORD_SWAP != 0xFFFFFFFF) //Need at least one read from LAN chip before writing to WORD_SWAP register
{
WORD_SWAP = 0xFFFFFFFF;
}
ETHERNET_DELAY(10000);
// soft reset
HW_CFG = HWCFG_SRST;
dwCnt = 100000;
do
{
ETHERNET_DELAY(10);
dwReg = HW_CFG;
dwCnt--;
}while ((dwCnt > 0) && (dwReg & HWCFG_SRST));
if (dwReg & HWCFG_SRST)
{
debug_printf("SH7264_SMSC_open: Error in Soft reset.\r\n");
return;
}
ETHERNET_DELAY(10000);
//Read Mac address from EEPROM
mac[0] = BIT_EDIANDW(SMSC9218_Read_Mac_Reg(ADDRL));
mac[1] = BIT_EDIANDW(SMSC9218_Read_Mac_Reg(ADDRH));
int macLen = __min(g_NetworkConfig.NetworkInterfaces[NETWORK_INTERFACE_INDEX_SH7264RSK].macAddressLen, sizeof(sc->mac_address));
dw = (DWORD)&g_NetworkConfig.NetworkInterfaces[NETWORK_INTERFACE_INDEX_SH7264RSK].macAddressBuffer[0];
if (((dw >= 0x00000000) && (dw <= 0x03000000)) || ((dw >= 0x20000000) && (dw <= 0x23000000)))
{
g_AM29DL_16_BS_DeviceTable.InitializeDevice(pBLOCK_CONFIG);
g_AM29DL_16_BS_DeviceTable.Write(pBLOCK_CONFIG,(DWORD)&g_NetworkConfig.NetworkInterfaces[NETWORK_INTERFACE_INDEX_SH7264RSK].macAddressBuffer[0],6,(BYTE *)mac,TRUE);
}
else
{
memcpy((void *)&g_NetworkConfig.NetworkInterfaces[NETWORK_INTERFACE_INDEX_SH7264RSK].macAddressBuffer[0], (void *)&mac[0], 6);
}
if(macLen > 0)
{
memcpy(&sc->mac_address[0], &g_NetworkConfig.NetworkInterfaces[NETWORK_INTERFACE_INDEX_SH7264RSK].macAddressBuffer[0], macLen);
}
else
{
RTP_DEBUG_ERROR("Device initialize without MAC address!!!\r\n", NOVAR, 0, 0);
}
// Now put in a dummy ethernet address
rtp_memcpy(&pi->addr.my_hw_addr[0], sc->mac_address, 6); // Get the ethernet address
// clear statistic information
sc->stats.packets_in = 0L;
sc->stats.packets_out = 0L;
sc->stats.bytes_in = 0L;
sc->stats.bytes_out = 0L;
sc->stats.errors_in = 0L;
sc->stats.errors_out = 0L;
if(RTP_FALSE == SH7264_SMSC_SetupDevice())
{
return RTP_FALSE;
}
rtp_irq_hook_interrupt( (RTP_PFVOID) pi,
(RTP_IRQ_FN_POINTER)SH7264_SMSC_recv,
(RTP_IRQ_FN_POINTER) 0);
return(RTP_TRUE);
}
示例5: klpd_unreg
int
klpd_unreg(int did, idtype_t type, id_t id)
{
door_handle_t dh;
int res = 0;
proc_t *p;
pid_t pid;
projid_t proj;
kproject_t *kpp = NULL;
credklpd_t *ckp;
switch (type) {
case P_PID:
pid = (pid_t)id;
break;
case P_PROJID:
proj = (projid_t)id;
kpp = project_hold_by_id(proj, crgetzone(CRED()),
PROJECT_HOLD_FIND);
if (kpp == NULL)
return (set_errno(ESRCH));
break;
default:
return (set_errno(ENOTSUP));
}
dh = door_ki_lookup(did);
if (dh == NULL) {
if (kpp != NULL)
project_rele(kpp);
return (set_errno(EINVAL));
}
if (kpp != NULL) {
mutex_enter(&klpd_mutex);
if (kpp->kpj_klpd == NULL)
res = ESRCH;
else
klpd_freelist(&kpp->kpj_klpd);
mutex_exit(&klpd_mutex);
project_rele(kpp);
goto out;
} else if ((int)pid > 0) {
mutex_enter(&pidlock);
p = prfind(pid);
if (p == NULL) {
mutex_exit(&pidlock);
door_ki_rele(dh);
return (set_errno(ESRCH));
}
mutex_enter(&p->p_crlock);
mutex_exit(&pidlock);
} else if (pid == 0) {
p = curproc;
mutex_enter(&p->p_crlock);
} else {
res = klpd_unreg_dh(dh);
goto out;
}
ckp = crgetcrklpd(p->p_cred);
if (ckp != NULL) {
crklpd_setreg(ckp, NULL);
} else {
res = ESRCH;
}
mutex_exit(&p->p_crlock);
out:
door_ki_rele(dh);
if (res != 0)
return (set_errno(res));
return (0);
}
示例6: sendfile
ssize_t sendfile(int outfd, int infd, off_t *offset, size_t count)
{
FAR uint8_t *iobuffer;
FAR uint8_t *wrbuffer;
off_t startpos = 0;
ssize_t nbytesread;
ssize_t nbyteswritten;
ssize_t ntransferred;
bool endxfr;
/* Get the current file position. */
if (offset) {
/* Use lseek to get the current file position */
startpos = lseek(infd, 0, SEEK_CUR);
if (startpos == (off_t)-1) {
return ERROR;
}
/* Use lseek again to set the new file position */
if (lseek(infd, *offset, SEEK_SET) == (off_t)-1) {
return ERROR;
}
}
/* Allocate an I/O buffer */
iobuffer = (FAR void *)lib_malloc(CONFIG_LIB_SENDFILE_BUFSIZE);
if (!iobuffer) {
set_errno(ENOMEM);
return ERROR;
}
/* Now transfer 'count' bytes from the infd to the outfd */
for (ntransferred = 0, endxfr = false; ntransferred < count && !endxfr;) {
/* Loop until the read side of the transfer comes to some conclusion */
do {
/* Read a buffer of data from the infd */
nbytesread = read(infd, iobuffer, CONFIG_LIB_SENDFILE_BUFSIZE);
/* Check for end of file */
if (nbytesread == 0) {
/* End of file. Break out and return current number of bytes
* transferred.
*/
endxfr = true;
break;
}
/* Check for a read ERROR. EINTR is a special case. This function
* should break out and return an error if EINTR is returned and
* no data has been transferred. But what should it do if some
* data has been transferred? I suppose just continue?
*/
else if (nbytesread < 0) {
/* EINTR is not an error (but will still stop the copy) */
#ifndef CONFIG_DISABLE_SIGNALS
if (errno != EINTR || ntransferred == 0)
#endif
{
/* Read error. Break out and return the error condition. */
ntransferred = ERROR;
endxfr = true;
break;
}
}
} while (nbytesread < 0);
/* Was anything read? */
if (!endxfr) {
/* Yes.. Loop until the read side of the transfer comes to some
* conclusion.
*/
wrbuffer = iobuffer;
do {
/* Write the buffer of data to the outfd */
nbyteswritten = write(outfd, wrbuffer, nbytesread);
/* Check for a complete (or parial) write. write() should not
* return zero.
*/
if (nbyteswritten >= 0) {
/* Advance the buffer pointer and decrement the number of bytes
* remaining in the iobuffer. Typically, nbytesread will now
* be zero.
*/
//.........这里部分代码省略.........
示例7: shmctl
int shmctl(int shmid, int cmd, struct shmid_ds *buf)
{
FAR struct shm_region_s *region;
int ret;
DEBUGASSERT(shmid >= 0 && shmid < CONFIG_ARCH_SHM_MAXREGIONS);
region = &g_shminfo.si_region[shmid];
DEBUGASSERT((region->sr_flags & SRFLAG_INUSE) != 0);
/* Get exclusive access to the region data structure */
ret = sem_wait(®ion->sr_sem);
if (ret < 0)
{
shmerr("ERROR: sem_wait failed: %d\n", ret);
return ret;
}
/* Handle the request according to the received cmd */
switch (cmd)
{
case IPC_STAT:
{
/* Place the current value of each member of the shmid_ds data
* structure associated with shmid into the structure pointed to
* by buf.
*/
DEBUGASSERT(buf);
memcpy(buf, ®ion->sr_ds, sizeof(struct shmid_ds));
}
break;
case IPC_SET:
{
/* Set the value of the shm_perm.mode member of the shmid_ds
* data structure associated with shmid to the corresponding
* value found in the structure pointed to by buf.
*/
region->sr_ds.shm_perm.mode = buf->shm_perm.mode;
}
break;
case IPC_RMID:
{
/* Are any processes attached to the region? */
if (region->sr_ds.shm_nattch > 0)
{
/* Yes.. just set the UNLINKED flag. The region will be removed when there are no longer any processes attached to it.
*/
region->sr_flags |= SRFLAG_UNLINKED;
}
else
{
/* No.. free the entry now */
shm_destroy(shmid);
/* Don't try anything further on the deleted region */
return OK;
}
}
break;
default:
shmerr("ERROR: Unrecognized command: %d\n", cmd);
ret = -EINVAL;
goto errout_with_semaphore;
}
/* Save the process ID of the the last operation */
region = &g_shminfo.si_region[shmid];
region->sr_ds.shm_lpid = getpid();
/* Save the time of the last shmctl() */
region->sr_ds.shm_ctime = time(NULL);
/* Release our lock on the entry */
sem_post(®ion->sr_sem);
return ret;
errout_with_semaphore:
sem_post(®ion->sr_sem);
set_errno(-ret);
return ERROR;
}
示例8: file_vfcntl
//.........这里部分代码省略.........
* successful execution of one of the exec functions.
*/
err = ENOSYS;
break;
case F_GETFL:
/* Get the file status flags and file access modes, defined in <fcntl.h>,
* for the file description associated with fildes. The file access modes
* can be extracted from the return value using the mask O_ACCMODE, which is
* defined in <fcntl.h>. File status flags and file access modes are associated
* with the file description and do not affect other file descriptors that
* refer to the same file with different open file descriptions.
*/
{
ret = this_file->f_oflags;
}
break;
case F_SETFL:
/* Set the file status flags, defined in <fcntl.h>, for the file description
* associated with fildes from the corresponding bits in the third argument,
* arg, taken as type int. Bits corresponding to the file access mode and
* the file creation flags, as defined in <fcntl.h>, that are set in arg shall
* be ignored. If any bits in arg other than those mentioned here are changed
* by the application, the result is unspecified.
*/
{
int oflags = va_arg(ap, int);
oflags &= FFCNTL;
this_file->f_oflags &= ~FFCNTL;
this_file->f_oflags |= oflags;
}
break;
case F_GETOWN:
/* If fildes refers to a socket, get the process or process group ID specified
* to receive SIGURG signals when out-of-band data is available. Positive values
* indicate a process ID; negative values, other than -1, indicate a process group
* ID. If fildes does not refer to a socket, the results are unspecified.
*/
case F_SETOWN:
/* If fildes refers to a socket, set the process or process group ID specified
* to receive SIGURG signals when out-of-band data is available, using the value
* of the third argument, arg, taken as type int. Positive values indicate a
* process ID; negative values, other than -1, indicate a process group ID. If
* fildes does not refer to a socket, the results are unspecified.
*/
err = EBADF; /* Only valid on socket descriptors */
break;
case F_GETLK:
/* Get the first lock which blocks the lock description pointed to by the third
* argument, arg, taken as a pointer to type struct flock, defined in <fcntl.h>.
* The information retrieved shall overwrite the information passed to fcntl() in
* the structure flock. If no lock is found that would prevent this lock from being
* created, then the structure shall be left unchanged except for the lock type
* which shall be set to F_UNLCK.
*/
case F_SETLK:
/* Set or clear a file segment lock according to the lock description pointed to
* by the third argument, arg, taken as a pointer to type struct flock, defined in
* <fcntl.h>. F_SETLK can establish shared (or read) locks (F_RDLCK) or exclusive
* (or write) locks (F_WRLCK), as well as to remove either type of lock (F_UNLCK).
* F_RDLCK, F_WRLCK, and F_UNLCK are defined in <fcntl.h>. If a shared or exclusive
* lock cannot be set, fcntl() shall return immediately with a return value of -1.
*/
case F_SETLKW:
/* This command shall be equivalent to F_SETLK except that if a shared or exclusive
* lock is blocked by other locks, the thread shall wait until the request can be
* satisfied. If a signal that is to be caught is received while fcntl() is waiting
* for a region, fcntl() shall be interrupted. Upon return from the signal handler,
* fcntl() shall return -1 with errno set to [EINTR], and the lock operation shall
* not be done.
*/
err = ENOSYS; /* Not implemented */
break;
default:
err = EINVAL;
break;
}
errout:
if (err != 0)
{
set_errno(err);
return ERROR;
}
return ret;
}
示例9: task_restart
//.........这里部分代码省略.........
* that CPU, the restart take effect.
*/
cpu = sched_cpu_pause(&tcb->cmn);
#endif /* CONFIG_SMP */
/* Try to recover from any bad states */
task_recover((FAR struct tcb_s *)tcb);
/* Kill any children of this thread */
#ifdef HAVE_GROUP_MEMBERS
(void)group_killchildren(tcb);
#endif
/* Remove the TCB from whatever list it is in. After this point, the TCB
* should no longer be accessible to the system
*/
#ifdef CONFIG_SMP
tasklist = TLIST_HEAD(tcb->cmn.task_state, tcb->cmn.cpu);
#else
tasklist = TLIST_HEAD(tcb->cmn.task_state);
#endif
dq_rem((FAR dq_entry_t *)tcb, tasklist);
tcb->cmn.task_state = TSTATE_TASK_INVALID;
/* Deallocate anything left in the TCB's queues */
sig_cleanup((FAR struct tcb_s *)tcb); /* Deallocate Signal lists */
/* Reset the current task priority */
tcb->cmn.sched_priority = tcb->cmn.init_priority;
/* The task should restart with pre-emption disabled and not in a critical
* secton.
*/
tcb->cmn.lockcount = 0;
#ifdef CONFIG_SMP
tcb->cmn.irqcount = 0;
#endif
/* Reset the base task priority and the number of pending reprioritizations */
#ifdef CONFIG_PRIORITY_INHERITANCE
tcb->cmn.base_priority = tcb->cmn.init_priority;
# if CONFIG_SEM_NNESTPRIO > 0
tcb->cmn.npend_reprio = 0;
# endif
#endif
/* Re-initialize the processor-specific portion of the TCB. This will
* reset the entry point and the start-up parameters
*/
up_initial_state((FAR struct tcb_s *)tcb);
/* Add the task to the inactive task list */
dq_addfirst((FAR dq_entry_t *)tcb, (FAR dq_queue_t *)&g_inactivetasks);
tcb->cmn.task_state = TSTATE_TASK_INACTIVE;
#ifdef CONFIG_SMP
/* Resume the paused CPU (if any) */
if (cpu >= 0)
{
ret = up_cpu_resume(cpu);
if (ret < 0)
{
errcode = -ret;
goto errout_with_lock;
}
}
#endif /* CONFIG_SMP */
leave_critical_section(flags);
/* Activate the task. */
ret = task_activate((FAR struct tcb_s *)tcb);
if (ret != OK)
{
(void)task_terminate(pid, true);
errcode = -ret;
goto errout_with_lock;
}
return OK;
errout_with_lock:
leave_critical_section(flags);
errout:
set_errno(errcode);
return ERROR;
}
示例10: CheckPerm
int CheckPerm(FCOM_T *comm_ptr, int permissions)
{
uid_t uid;
gid_t gid;
/*-------------------------------------------------------------------*/
/* Get group and user ID for current process. */
/*-------------------------------------------------------------------*/
FsGetId(&uid, &gid);
/*-------------------------------------------------------------------*/
/* Check if we need to look at read permissions. */
/*-------------------------------------------------------------------*/
if (permissions & F_READ)
{
/*-----------------------------------------------------------------*/
/* If other has no read permission, check group. */
/*-----------------------------------------------------------------*/
if ((comm_ptr->mode & S_IROTH) == FALSE)
{
/*---------------------------------------------------------------*/
/* If not in group or group has no read permission, check owner. */
/*---------------------------------------------------------------*/
if ((gid != comm_ptr->group_id) || !(comm_ptr->mode & S_IRGRP))
{
/*-------------------------------------------------------------*/
/* If not user or user has no read permissions, return error. */
/*-------------------------------------------------------------*/
if ((uid != comm_ptr->user_id) || !(comm_ptr->mode & S_IRUSR))
{
set_errno(EACCES);
return -1;
}
}
}
}
/*-------------------------------------------------------------------*/
/* Check if we need to look at write permissions. */
/*-------------------------------------------------------------------*/
if (permissions & F_WRITE)
{
/*-----------------------------------------------------------------*/
/* If other has no write permission, check group. */
/*-----------------------------------------------------------------*/
if ((comm_ptr->mode & S_IWOTH) == 0)
{
/*---------------------------------------------------------------*/
/* If not in group or group has no write permission, check owner.*/
/*---------------------------------------------------------------*/
if ((gid != comm_ptr->group_id) || !(comm_ptr->mode & S_IWGRP))
{
/*-------------------------------------------------------------*/
/* If not user or user has no write permissions, return error. */
/*-------------------------------------------------------------*/
if ((uid != comm_ptr->user_id) || !(comm_ptr->mode & S_IWUSR))
{
set_errno(EACCES);
return -1;
}
}
}
}
/*-------------------------------------------------------------------*/
/* Check if we need to look at execute permissions. */
/*-------------------------------------------------------------------*/
if (permissions & F_EXECUTE)
{
/*-----------------------------------------------------------------*/
/* If other has no execute permission, check group. */
/*-----------------------------------------------------------------*/
if ((comm_ptr->mode & S_IXOTH) == 0)
{
/*---------------------------------------------------------------*/
/* If not in group or group can't execute, check owner. */
/*---------------------------------------------------------------*/
if ((gid != comm_ptr->group_id) || !(comm_ptr->mode & S_IXGRP))
{
/*-------------------------------------------------------------*/
/* If not user or user can't execute, return error. */
/*-------------------------------------------------------------*/
if ((uid != comm_ptr->user_id) || !(comm_ptr->mode & S_IXUSR))
{
set_errno(EACCES);
return -1;
}
}
}
}
return 0;
}
示例11: mach_sysconfig
/*ARGSUSED*/
int
mach_sysconfig(int which)
{
return (set_errno(EINVAL));
}
示例12: DEBUGASSERT
FAR void *shmat(int shmid, FAR const void *shmaddr, int shmflg)
{
FAR struct shm_region_s *region;
FAR struct task_group_s *group;
FAR struct tcb_s *tcb;
uintptr_t vaddr;
unsigned int npages;
int ret;
/* Get the region associated with the shmid */
DEBUGASSERT(shmid >= 0 && shmid < CONFIG_ARCH_SHM_MAXREGIONS);
region = &g_shminfo.si_region[shmid];
DEBUGASSERT((region->sr_flags & SRFLAG_INUSE) != 0);
/* Get the TCB and group containing our virtual memory allocator */
tcb = sched_self();
DEBUGASSERT(tcb && tcb->group);
group = tcb->group;
DEBUGASSERT(group->tg_shm.gs_handle != NULL &&
group->tg_shm.gs_vaddr[shmid] == 0);
/* Get exclusive access to the region data structure */
ret = sem_wait(®ion->sr_sem);
if (ret < 0)
{
shmdbg("sem_wait failed: %d\n", ret);
goto errout;
}
/* Set aside a virtual address space to span this physical region */
vaddr = (uintptr_t)gran_alloc(group->tg_shm.gs_handle,
region->sr_ds.shm_segsz);
if (vaddr == 0)
{
shmdbg("gran_alloc() failed\n");
ret = -ENOMEM;
goto errout_with_semaphore;
}
/* Convert the region size to pages */
npages = MM_PGALIGNUP(region->sr_ds.shm_segsz);
/* Attach, i.e, map, on shared memory region to the user virtual address. */
ret = up_shmat(region->sr_pages, npages, vaddr);
if (ret < 0)
{
shmdbg("up_shmat() failed\n");
goto errout_with_vaddr;
}
/* Save the virtual address of the region. We will need that in shmat()
* to do the reverse lookup: Give the virtual address of the region to
* detach, we need to get the region table index.
*/
group->tg_shm.gs_vaddr[shmid] = vaddr;
/* Increment the count of processes attached to this region */
region->sr_ds.shm_nattch++;
/* Save the process ID of the the last operation */
region->sr_ds.shm_lpid = tcb->pid;
/* Save the time of the last shmat() */
region->sr_ds.shm_atime = time(NULL);
/* Release our lock on the entry */
sem_post(®ion->sr_sem);
return (FAR void *)vaddr;
errout_with_vaddr:
gran_free(group->tg_shm.gs_handle, (FAR void *)vaddr,
region->sr_ds.shm_segsz);
errout_with_semaphore:
sem_post(®ion->sr_sem);
set_errno(-ret);
errout:
return (FAR void *)ERROR;
}
示例13: fpathconf
long fpathconf(int fid, int name)
{
long rv;
#if OS_PARM_CHECK
/*-------------------------------------------------------------------*/
/* Ensure file descriptor is valid. */
/*-------------------------------------------------------------------*/
if (fid < 0 || fid >= FOPEN_MAX)
{
set_errno(EBADF);
return -1;
}
#endif
/*-------------------------------------------------------------------*/
/* Return error if file is closed. */
/*-------------------------------------------------------------------*/
if (Files[fid].ioctl == NULL)
{
set_errno(EBADF);
return -1;
}
/*-------------------------------------------------------------------*/
/* Based on the name variable, get the right value. */
/*-------------------------------------------------------------------*/
switch (name)
{
/*-----------------------------------------------------------------*/
/* _PC_NAME_MAX and _PC_PATH_MAX have the same value. */
/*-----------------------------------------------------------------*/
case _PC_NAME_MAX:
case _PC_PATH_MAX:
{
rv = PATH_MAX;
break;
}
case _PC_NO_TRUNC:
{
rv = _PATH_NO_TRUNC;
break;
}
case _PC_LINK_MAX:
{
/*---------------------------------------------------------------*/
/* The link counter is stored in a "ui8". */
/*---------------------------------------------------------------*/
rv = 255;
break;
}
/*-----------------------------------------------------------------*/
/* All other variables have no limit, so return -1 for them. */
/*-----------------------------------------------------------------*/
default:
{
rv = -1;
break;
}
}
return rv;
}
示例14: lx_sysinfo
long
lx_sysinfo(struct lx_sysinfo *sip)
{
struct lx_sysinfo si;
zone_t *zone = curthread->t_procp->p_zone;
uint64_t zphysmem, zfreemem, ztotswap, zfreeswap;
si.si_uptime = gethrestime_sec() - zone->zone_boot_time;
/*
* We scale down the load in avenrun to allow larger load averages
* to fit in 32 bits. Linux doesn't, so we remove the scaling
* here.
*/
si.si_loads[0] = zone->zone_avenrun[0] << FSHIFT;
si.si_loads[1] = zone->zone_avenrun[1] << FSHIFT;
si.si_loads[2] = zone->zone_avenrun[2] << FSHIFT;
/*
* In linux each thread looks like a process, so we conflate the
* two in this stat as well.
*/
si.si_procs = (int32_t)zone->zone_nlwps;
/*
* If memory or swap limits are set on the zone, use those, otherwise
* use the system values. physmem and freemem are in pages, but the
* zone values are in bytes. Likewise, ani_max and ani_free are in
* pages.
*/
if (zone->zone_phys_mem_ctl == UINT64_MAX) {
zphysmem = physmem;
zfreemem = freemem;
} else {
zphysmem = btop(zone->zone_phys_mem_ctl);
zfreemem = btop(zone->zone_phys_mem_ctl - zone->zone_phys_mem);
}
if (zone->zone_max_swap_ctl == UINT64_MAX) {
ztotswap = k_anoninfo.ani_max;
zfreeswap = k_anoninfo.ani_free;
} else {
/*
* See the comment in swapctl for a description of how free is
* calculated within a zone.
*/
rctl_qty_t used;
spgcnt_t avail;
uint64_t max;
avail = MAX((spgcnt_t)(availrmem - swapfs_minfree), 0);
max = k_anoninfo.ani_max + k_anoninfo.ani_mem_resv + avail;
mutex_enter(&zone->zone_mem_lock);
ztotswap = btop(zone->zone_max_swap_ctl);
used = btop(zone->zone_max_swap);
mutex_exit(&zone->zone_mem_lock);
zfreeswap = MIN(ztotswap, max) - used;
}
/*
* If the maximum memory stat is less than 1^20 pages (i.e. 4GB),
* then we report the result in bytes. Otherwise we use pages.
* Once we start supporting >1TB systems/zones, we'll need a third
* option.
*/
if (MAX(zphysmem, ztotswap) < 1024 * 1024) {
si.si_totalram = ptob(zphysmem);
si.si_freeram = ptob(zfreemem);
si.si_totalswap = ptob(ztotswap);
si.si_freeswap = ptob(zfreeswap);
si.si_mem_unit = 1;
} else {
si.si_totalram = zphysmem;
si.si_freeram = zfreemem;
si.si_totalswap = ztotswap;
si.si_freeswap = zfreeswap;
si.si_mem_unit = PAGESIZE;
}
si.si_bufferram = 0;
si.si_sharedram = 0;
/*
* These two stats refer to high physical memory. If an
* application running in a Linux zone cares about this, then
* either it or we are broken.
*/
si.si_totalhigh = 0;
si.si_freehigh = 0;
if (copyout(&si, sip, sizeof (si)) != 0)
return (set_errno(EFAULT));
return (0);
}
示例15: setregid
/*
* Buy-back from SunOS 4.x
*
* Like setgid() and setegid() combined -except- that non-root users
* can change cr_rgid to cr_gid, and the semantics of cr_sgid are
* subtly different.
*/
int
setregid(gid_t rgid, gid_t egid)
{
proc_t *p;
int error = EPERM;
int do_nocd = 0;
cred_t *cr, *newcr;
ksid_t ksid, *ksp;
zone_t *zone = crgetzone(CRED());
if ((rgid != -1 && !VALID_GID(rgid, zone)) ||
(egid != -1 && !VALID_GID(egid, zone)))
return (set_errno(EINVAL));
if (egid != -1 && egid > MAXUID) {
if (ksid_lookupbygid(zone, egid, &ksid) != 0)
return (set_errno(EINVAL));
ksp = &ksid;
} else {
ksp = NULL;
}
/*
* Need to pre-allocate the new cred structure before grabbing
* the p_crlock mutex.
*/
newcr = cralloc_ksid();
p = ttoproc(curthread);
mutex_enter(&p->p_crlock);
cr = p->p_cred;
if ((rgid == -1 ||
rgid == cr->cr_rgid || rgid == cr->cr_gid || rgid == cr->cr_sgid) &&
(egid == -1 || egid == cr->cr_rgid || egid == cr->cr_gid ||
egid == cr->cr_sgid) ||
(error = secpolicy_allow_setid(cr, -1, B_FALSE)) == 0) {
crhold(cr);
crcopy_to(cr, newcr);
p->p_cred = newcr;
if (egid != -1) {
newcr->cr_gid = egid;
crsetsid(newcr, ksp, KSID_GROUP);
}
if (rgid != -1)
newcr->cr_rgid = rgid;
/*
* "If the real gid is being changed, or the effective gid is
* being changed to a value not equal to the real gid, the
* saved gid is set to the new effective gid."
*/
if (rgid != -1 ||
(egid != -1 && newcr->cr_gid != newcr->cr_rgid))
newcr->cr_sgid = newcr->cr_gid;
/*
* A privileged process that makes itself look like a
* set-gid process must be marked to produce no core dump.
*/
if ((cr->cr_gid != newcr->cr_gid ||
cr->cr_rgid != newcr->cr_rgid ||
cr->cr_sgid != newcr->cr_sgid) && error == 0)
do_nocd = 1;
error = 0;
crfree(cr);
}
mutex_exit(&p->p_crlock);
if (error == 0) {
if (do_nocd) {
mutex_enter(&p->p_lock);
p->p_flag |= SNOCD;
mutex_exit(&p->p_lock);
}
crset(p, newcr); /* broadcast to process threads */
return (0);
}
crfree(newcr);
if (ksp != NULL)
ksid_rele(ksp);
return (set_errno(error));
}