int ioctl_sem_unlock(struct ipc_driver *drv, unsigned long arg) { int error = 0; struct ipc_unlock_t ipc_param; if(copy_from_user(&ipc_param, (void *)arg, sizeof(struct ipc_unlock_t))) { err_msg(err_trace, "%s(): Error in copy_from_user()\n", __FUNCTION__); error = -EFAULT; goto do_exit; } error = ipc_sem_unlock( drv, &ipc_param ); if(error < 0) { err_msg(err_trace, "%s(): Error in ipc_sem_up()\n", __FUNCTION__); goto do_exit; } do_exit: return error; }
int test_ipc_sem(enum ipc_sem_type type, void* arg) { ipc_sem sem = NULL; pid_t p = -1; struct tm* timeinfo = NULL; time_t timeo; char buf[256]; if(!ipc_sem_is_supported(type)) { fprintf(stderr, "Semaphore type %d not supported!\n", type); return -1; } sem = ipc_sem_new(type, arg, O_CREAT, 0700, 1); if(!sem) { perror("ipc_sem_new"); return -1; } p = fork(); if(p == -1) { perror("fork"); ipc_sem_free(&sem, 1); return -1; } else if(p > 0) { int status = -1; /* father */ sleep(1); time(&timeo); timeinfo = localtime(&timeo); sprintf(buf, "[%d %d %d %d:%d:%d]", timeinfo->tm_mday, timeinfo->tm_mon + 1, timeinfo->tm_year + 1900, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); fprintf(stdout, "%s[FATHER] Try to lock semaphore\n", buf); ipc_sem_lock(sem); time(&timeo); timeinfo = localtime(&timeo); sprintf(buf, "[%d %d %d %d:%d:%d]", timeinfo->tm_mday, timeinfo->tm_mon + 1, timeinfo->tm_year + 1900, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); fprintf(stdout, "%s[FATHER] Semaphore locked\n", buf); ipc_sem_unlock(sem); time(&timeo); timeinfo = localtime(&timeo); sprintf(buf, "[%d %d %d %d:%d:%d]", timeinfo->tm_mday, timeinfo->tm_mon + 1, timeinfo->tm_year + 1900, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); fprintf(stdout, "%s[FATHER] Semaphore unlocked\n", buf); /* wait son termination */ wait(&status); time(&timeo); timeinfo = localtime(&timeo); sprintf(buf, "[%d %d %d %d:%d:%d]", timeinfo->tm_mday, timeinfo->tm_mon + 1, timeinfo->tm_year + 1900, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); fprintf(stdout, "%s[FATHER] Son terminated\n", buf); fprintf(stdout, "Test OK!\n"); } else { /* son */ time(&timeo); timeinfo = localtime(&timeo); sprintf(buf, "[%d %d %d %d:%d:%d]", timeinfo->tm_mday, timeinfo->tm_mon + 1, timeinfo->tm_year + 1900, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); fprintf(stdout, "%s[SON] Try to lock semaphore\n", buf); ipc_sem_lock(sem); time(&timeo); timeinfo = localtime(&timeo); sprintf(buf, "[%d %d %d %d:%d:%d]", timeinfo->tm_mday, timeinfo->tm_mon + 1, timeinfo->tm_year + 1900, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); fprintf(stdout, "%s[SON] Semaphore locked\n", buf); sleep(3); ipc_sem_unlock(sem); time(&timeo); timeinfo = localtime(&timeo); sprintf(buf, "[%d %d %d %d:%d:%d]", timeinfo->tm_mday, timeinfo->tm_mon + 1, timeinfo->tm_year + 1900, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); fprintf(stdout, "%s[SON] Semaphore unlocked\n", buf); } ipc_sem_free(&sem, 1); return 0; }