int felica_uart_write(char *buf, size_t count) { mm_segment_t old_fs = get_fs(); int n; #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_UART] write_hs_uart - start \n"); #endif if (uart_f == NULL) { #ifdef FEATURE_DEBUG_HIGH FELICA_DEBUG_MSG("[FELICA_UART] felica_uart is not opened\n"); #endif return 0; } set_fs(KERNEL_DS); n = vfs_write(uart_f, buf, count, &uart_f->f_pos); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_UART] write_hs_uart - write (%d)\n", n); #endif set_fs(old_fs); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_UART] write_hs_uart - end \n"); #endif return n; }
/* * Description : * Input : * Output : */ int felica_gpio_open(int gpionum, int direction, int value) { int rc = 0; /* Cofigure GPIO */ rc = gpio_tlmm_config(gpionum, GPIO_CONFIG_ENABLE); if(rc) { FELICA_DEBUG_MSG("[FELICA] ERROR - gpio_tlmm_config \n"); return rc; } /* Set output direction */ if(GPIO_DIRECTION_IN == direction) { rc = gpio_direction_input(gpionum); if(rc) { FELICA_DEBUG_MSG("[FELICA] ERROR - gpio_direction_input \n"); return rc; } } else { rc = gpio_direction_output(gpionum, value); if(rc) { FELICA_DEBUG_MSG("[FELICA] ERROR - gpio_direction_output \n"); return rc; } } return rc; }
/* * Description : MFC calls this function using close method(void close()) of FileOutputStream class * When this fuction is excuted, set PON to Low. * Input : None * Output : Success : 0 Fail : Other */ static int felica_rws_release (struct inode *inode, struct file *fp) { #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RWS] felica_rws_release - start \n"); #endif if(0 == isopen) { #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RWS] felica_rws_release - not open \n"); #endif return -1; } else { isopen = 0; #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RWS] felica_rws_release - end \n"); #endif } #ifdef FELICA_FN_DEVICE_TEST FELICA_DEBUG_MSG("[FELICA_RWS] felica_rws_release - result(%d) \n",result_close_rws); return result_close_rws; #else return 0; #endif }
/* * Description: MFC calls this function using close method(int close()) of FileInputStream class * Input: None * Output: RFS low : 1 RFS high : 0 */ static int felica_rfs_release (struct inode *inode, struct file *fp) { if(0 == isopen) { #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RFS] felica_rfs_release - not open \n"); #endif return -1; } else { #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RFS] felica_rfs_release - start \n"); #endif isopen = 0; } #ifdef FELICA_LED_SUPPORT isFelicaUsed = 0; #endif #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RFS] felica_rfs_release - end \n"); #endif #ifdef FELICA_FN_DEVICE_TEST FELICA_DEBUG_MSG("[FELICA_RFS] felica_rfs_release - result(%d) \n",result_close_rfs); return result_close_rfs; #else return 0; #endif }
static void felica_int_low_work(struct work_struct *data) { int rc = 0; lock_felica_wake_lock(); disable_irq_nosync(gpio_to_irq(GPIO_FELICA_INT)); usermodehelper_enable(); //#ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RWS] felica_int_low_work - start \n"); //#endif rc = invoke_felica_apk(); if(rc) { FELICA_DEBUG_MSG("[FELICA_RWS] Error - invoke app \n"); unlock_felica_wake_lock(); } //#ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RWS] felica_int_low_work - end \n"); //#endif enable_irq(gpio_to_irq(GPIO_FELICA_INT)); }
/* * Description : MFC calls this function using close method(void open()) of FileOutputStream class * When this fuction is excuted, set PON to Low. * Input : None * Output : Success : 0 Fail : Other */ static int felica_rws_open (struct inode *inode, struct file *fp) { int rc = 0; if(1 == isopen) { #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RWS] felica_rws_open - already open \n"); #endif return -1; } else { #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RWS] felica_rws_open - start \n"); #endif isopen = 1; } rc = felica_gpio_open(GPIO_FELICA_INT, GPIO_DIRECTION_IN, GPIO_HIGH_VALUE); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RWS] felica_rws_open - end \n"); #endif #ifdef FELICA_FN_DEVICE_TEST FELICA_DEBUG_MSG("[FELICA_RWS] felica_rws_open - result(%d) \n",result_open_rws); return result_open_rws; #else return rc; #endif }
/* * Description : get size of remaing data * Input : none * Output : success : data length fail : 0 */ int felica_uart_ioctrl(int *count) { mm_segment_t old_fs = get_fs(); int rc = 0; #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_UART] felica_uart_ioctrl - start \n"); #endif if(0 > fd) { FELICA_DEBUG_MSG("[FELICA_UART] felica_uart is not opened\n"); return rc; } set_fs(KERNEL_DS); rc = sys_ioctl(fd, TIOCINQ, (unsigned long)count); set_fs(old_fs); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_UART] felica_uart_ioctrl - end \n"); #endif return rc; }
static void felica_rfs_interrupt_work(struct work_struct *data) { int rc = 0; disable_irq_nosync(gpio_to_irq(felica_get_rfs_gpio_num())); usermodehelper_enable(); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RFS] felica_rfs_interrupt_work - start \n"); #endif rc = invoke_led_service(); if(rc) { #ifdef FEATURE_DEBUG_HIGH FELICA_DEBUG_MSG("[FELICA_RFS] Error - invoke app \n"); unlock_felica_rfs_wake_lock(); isFelicaUsed =0; #endif } #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RFS] felica_rfs_interrupt_work - end \n"); #endif enable_irq(gpio_to_irq(felica_get_rfs_gpio_num())); }
int felica_uart_close(void) { mm_segment_t old_fs = get_fs(); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_UART] close_hs_uart - start \n"); #endif if (uart_f == NULL) { #ifdef FEATURE_DEBUG_HIGH FELICA_DEBUG_MSG("[FELICA_UART] felica_uart is not opened \n"); #endif return 0; } set_felica_uart_status(UART_STATUS_READY); set_fs(KERNEL_DS); filp_close(uart_f, NULL); uart_f = NULL; set_fs(old_fs); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_UART] close_hs_uart - end \n"); #endif return 0; }
int felica_uart_ioctrl(int *count) { mm_segment_t old_fs = get_fs(); int n; #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_UART] felica_uart_ioctrl - start \n"); #endif if (uart_f == NULL) { #ifdef FEATURE_DEBUG_HIGH FELICA_DEBUG_MSG("[FELICA_UART] felica_uart is not opened\n"); #endif return 0; } set_fs(KERNEL_DS); n = do_vfs_ioctl(uart_f, -1, TIOCINQ, (unsigned long)count); #ifdef FEATURE_DEBUG_MED FELICA_DEBUG_MSG("[FELICA_UART] do_vfs_ioctl return(%d), count(%d) \n", n, *count); #endif set_fs(old_fs); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_UART] felica_uart_ioctrl - end \n"); #endif return n; }
/* * Description : open uart * Input : None * Output : success : 0 fail : others */ int felica_uart_open(void) { // struct termios newtio; int rc; mm_segment_t old_fs = get_fs(); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_UART] open_hs_uart - start \n"); #endif if(0 <= fd) { FELICA_DEBUG_MSG("[FELICA_UART] felica_uart is already opened fd : %d\n",fd); return 0; } set_fs(KERNEL_DS); fd = sys_open("/dev/ttyO3", O_RDWR | O_NOCTTY | O_NONBLOCK, 0); FELICA_DEBUG_MSG("[FELICA_UART] open UART - fd : %d \n",fd); if (fd < 0) { FELICA_DEBUG_MSG("[FELICA_UART] ERROR - can not sys_open \n"); set_fs(old_fs); return fd; } { /* Set speed */ struct termios newtio; // yjchoi; 120412 temporary block due to build error serial_omap_disable_console_port(); // yjchoi; 120412 temporary block due to build error rc = felica_gpio_open(GPIO_FELICA_UART_SW, GPIO_DIRECTION_OUT, GPIO_LOW_VALUE); felica_gpio_write(GPIO_FELICA_UART_SW, 0); sys_ioctl(fd, TCGETS, (unsigned long)&newtio); memcpy(&console_settings, &newtio, sizeof(struct termios)); memset(&newtio, 0, sizeof(newtio)); newtio.c_cflag = B460800 | CS8 | CLOCAL | CREAD; newtio.c_cc[VMIN] = 1; newtio.c_cc[VTIME] = 5; sys_ioctl(fd, TCFLSH, TCIOFLUSH); sys_ioctl(fd, TCSETSF, (unsigned long)&newtio); } set_fs(old_fs); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_UART] open_hs_uart - end \n"); #endif return 0; }
/* * Description : * Input : * Output : */ static ssize_t felica_cal_read(struct file *fp, char *buf, size_t count, loff_t *pos) { unsigned char read_buf = 0x00; int rc = -1; #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_CAL] felica_cal_read - start \n"); #endif /* Check error */ if(NULL == fp) { FELICA_DEBUG_MSG("[FELICA_CAL] ERROR fp \n"); return -1; } if(NULL == buf) { FELICA_DEBUG_MSG("[FELICA_CAL] ERROR buf \n"); return -1; } if(1 != count) { FELICA_DEBUG_MSG("[FELICA_CAL] ERROR count \n"); return -1; } if(NULL == pos) { FELICA_DEBUG_MSG("[FELICA_CAL] ERROR file \n"); return -1; } rc = felica_i2c_read(FELICA_I2C_REG_ADDRSS_01, &read_buf, 1); if(rc) { FELICA_DEBUG_MSG("[FELICA_CAL] felica_i2c_read : %d \n",rc); return -1; } #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_CAL] felica_cal : 0x%02x \n",read_buf); #endif rc = copy_to_user(buf, &read_buf, count); if(rc) { FELICA_DEBUG_MSG("[FELICA_CAL] ERROR - copy_from_user \n"); return -1; } #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_CAL] felica_cal_read - end \n"); #endif return 1; }
static void felica_rfs_open_after_boot_work(struct work_struct *data) { int rc = 0; #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RFS] felica_rfs_open_after_boot_work - start"); #endif rc = felica_gpio_open(felica_get_rfs_gpio_num(), GPIO_DIRECTION_IN, GPIO_HIGH_VALUE); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RFS] felica_rfs_open_after_boot_work - end"); #endif }
/* * Description : close uart * Input : None * Output : success : 0 */ int felica_uart_close(void) { mm_segment_t old_fs = get_fs(); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_UART] close_hs_uart - start \n"); #endif if(0 > fd) { FELICA_DEBUG_MSG("[FELICA_UART] felica_uart is not opened\n"); return 0; } set_fs(KERNEL_DS); { /* Set speed */ struct termios settings; sys_ioctl(fd, TCGETS, (unsigned long)&settings); #if 1 memcpy(&settings, &console_settings, sizeof(struct termios)); FELICA_DEBUG_MSG("[FELICA_UART] Set BAUD rate to 115200\n"); #else if((settings.c_cflag & CBAUD) == B460800) { settings.c_cflag &= ~(CBAUD); settings.c_cflag |= B115200; FELICA_DEBUG_MSG("[FELICA_UART] Set BAUD rate to 115200\n"); } #endif sys_ioctl(fd, TCSETS, (unsigned long)&settings); } sys_close(fd); fd = -1; felica_gpio_write(GPIO_FELICA_UART_SW, 1); // yjchoi; 120412 temporary block due to build error serial_omap_enable_console_port(); set_fs(old_fs); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_UART] close_hs_uart - end \n"); #endif return 0; }
irqreturn_t felica_rfs_detect_interrupt(int irq, void *dev_id) { #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RFS] felica_rfs_low_isr - start \n"); #endif schedule_delayed_work(&felica_rfs_interrupt,0); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RFS] felica_rfs_low_isr - end \n"); #endif return IRQ_HANDLED; }
/* * Description : * Input : * Output : */ static void felica_cal_exit(void) { #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_CAL] felica_cal_exit - start \n"); #endif /* deregister the device file */ misc_deregister(&felica_cal_device); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_CAL] felica_cal_exit - end \n"); #endif }
static void felica_rws_exit(void) { #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_INT] felica_rws_exit - start \n"); #endif free_irq(gpio_to_irq(GPIO_FELICA_INT), NULL); misc_deregister(&felica_rws_device); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_INT] felica_rws_exit - end \n"); #endif }
static irqreturn_t felica_int_low_isr(int irq, void *dev_id) { #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RWS] felica_int_low_isr - start \n"); #endif schedule_delayed_work(&felica_int_work,0); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RWS] felica_int_low_isr - end \n"); #endif return IRQ_HANDLED; }
/* * Description : * Input : * Output : */ static void felica_exit(void) { #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA] felica_exit - start \n"); #endif destroy_felica_wake_lock(); /* deregister the device file */ misc_deregister(&felica_device); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA] felica_exit - end \n"); #endif }
int felica_get_rfs_gpio_num(void) { /* */ int gpionum = GPIO_FELICA_RFS; pr_info("CBAL current rev -> %d \n",lge_get_board_revno()); if (lge_get_board_revno() < HW_REV_B) { pr_info("CBAL RFS-CDET gpio rev old -> %d \n",GPIO_FELICA_RFS_REV_A); gpionum = GPIO_FELICA_RFS_REV_A; } else { pr_info("CBAL RFS-CDET gpio rev -> %d \n",GPIO_FELICA_RFS); gpionum = GPIO_FELICA_RFS; } #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_GPIO] felica_get_rfs_gpio_num(%d) \n",gpionum); #endif return gpionum; return GPIO_FELICA_RFS; }
/* * Description : * Input : * Output : */ static int felica_fsync(struct file *fp, loff_t param1, loff_t param2, int datasync) { FELICA_DEBUG_MSG("[FELICA] felica_fsync\n"); // TODO: TRANSMIT DATA TO FELICA CHIP return 0; }
/* * Description : * Input : * Output : */ static int felica_cal_release (struct inode *inode, struct file *fp) { #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_CAL] felica_cal_release \n"); #endif return 0; }
/* * FUNCTION DEFINITION */ static int invoke_felica_apk(void) { char *argv[] = { "/system/bin/sh","/system/bin/am", "start", "-n", FELICA_INTENT, "--activity-clear-top", NULL }; static char *envp[] = {FELICA_LD_LIBRARY_PATH,FELICA_BOOTCLASSPATH,FELICA_PATH,NULL }; int rc = 0; #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RWS] invoke felica app... \n"); #endif rc = call_usermodehelper( argv[0], argv, envp, UMH_WAIT_EXEC ); FELICA_DEBUG_MSG("[FELICA_RWS] felica app result : %d \n", rc); return rc; }
/* * Description : * Input : None * Output : */ void set_felica_i2c_status(_e_snfc_i2c_status i2c_status) { #if defined(CONFIG_LGE_FELICA_NFC)&& defined(FELICA_NFC_INTERFACE) #ifdef FEATURE_DEBUG_MED FELICA_DEBUG_MSG("[FELICA_COMMON] set_felica_i2c_status : %d \n", i2c_status); #endif __snfc_i2c_control_set_status(i2c_status); #endif }
static void felica_rfs_exit(void) { #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RFS] felica_rfs_exit - start \n"); #endif #ifdef FELICA_LED_SUPPORT free_irq(gpio_to_irq(GPIO_FELICA_RFS), NULL); destroy_felica_rfs_wake_lock(); #endif /* deregister the device file */ misc_deregister(&felica_rfs_device); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_RFS] felica_rfs_exit - end \n"); #endif }
/* * Description : * Input : * Output : */ int felica_i2c_read(unsigned char reg, unsigned char *buf, size_t count) { ssize_t rc = 0; mm_segment_t old_fs = get_fs(); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_I2C] felica_i2c_read\n"); #endif set_fs(KERNEL_DS); /* dev/i2c-0 device file open */ rc = felica_i2c_open(); if (rc) { FELICA_DEBUG_MSG("[FELICA_I2C] ERROR - felica_i2c_open : %d \n",rc); return rc; } /* Set slave address */ rc = felica_i2c_set_slave_address(I2C_FELICA_SLAVE_ADDRESS); if (rc) { FELICA_DEBUG_MSG("[FELICA_I2C] ERROR - felica_i2c_set_slave_address : %d \n",rc); return rc; } /* set register address */ rc = sys_write(fd, ®, 1); if (rc < 0) { FELICA_DEBUG_MSG("[FELICA_I2C] ERROR - sys_write : %d \n",rc); return rc; } /* read register data */ rc = sys_read(fd, buf, count); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_I2C] read data : 0x%02x \n",*buf); #endif if (rc < 0) { FELICA_DEBUG_MSG("[FELICA_I2C] ERROR - sys_read : %d \n",rc); return rc; } /* release i2c */ rc = felica_i2c_release(); if (rc) { FELICA_DEBUG_MSG("[FELICA_I2C] ERROR - felica_i2c_release : %d \n",rc); return rc; } set_fs(old_fs); return 0; }
int felica_uart_read(char *buf, size_t count) { mm_segment_t old_fs = get_fs(); int n; int retry = 5; #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_UART] read_hs_uart - start \n"); #endif if (uart_f == NULL) { #ifdef FEATURE_DEBUG_HIGH FELICA_DEBUG_MSG("[FELICA_UART] felica_uart is not opened\n"); #endif return 0; } set_fs(KERNEL_DS); while ((n = vfs_read(uart_f, buf, count, &uart_f->f_pos)) == -EAGAIN && retry > 0) { mdelay(10); #ifdef FEATURE_DEBUG_MED FELICA_DEBUG_MSG("[FELICA_UART] felica_uart_read - delay : %d \n", retry); #endif retry--; } #ifdef FEATURE_DEBUG_MED FELICA_DEBUG_MSG("[FELICA_UART] read_hs_uart - count(%d), num of read data(%d) \n",count ,n); #endif set_fs(old_fs); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_UART] read_hs_uart - end \n"); #endif return n; }
/* * Description : open uart * Input : None * Output : success : 0 fail : others */ int felica_uart_open(void) { struct termios newtio; mm_segment_t old_fs = get_fs(); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_UART] open_hs_uart - start \n"); #endif if (uart_f != NULL) { FELICA_DEBUG_MSG("[FELICA_UART] felica_uart is already opened\n"); return 0; } set_fs(KERNEL_DS); uart_f = filp_open("/dev/ttyHSL3", O_RDWR | O_NOCTTY | O_NONBLOCK, 0); FELICA_DEBUG_MSG("[FELICA_UART] open UART\n"); if (uart_f == NULL) { FELICA_DEBUG_MSG("[FELICA_UART] ERROR - can not sys_open \n"); set_fs(old_fs); return -1; } memset(&newtio, 0, sizeof(newtio)); newtio.c_cflag = B460800 | CS8 | CLOCAL | CREAD; newtio.c_cc[VMIN] = 1; newtio.c_cc[VTIME] = 5; do_vfs_ioctl(uart_f, -1, TCFLSH, TCIOFLUSH); do_vfs_ioctl(uart_f, -1, TCSETSF, (unsigned long)&newtio); set_fs(old_fs); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_UART] open_hs_uart - end \n"); #endif return 0; }
/* * Description : * Input : * Output : */ int felica_i2c_release (void) { int rc = 0; mm_segment_t old_fs = get_fs(); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_I2C] felica_i2c_release\n"); #endif set_fs(KERNEL_DS); rc = sys_close(fd); if (rc < 0) { FELICA_DEBUG_MSG("[FELICA_I2C] ERROR - felica_i2c_release : %d \n", rc); return rc; } set_fs(old_fs); return 0; }
/* * Description : * Input : * Output : */ int felica_i2c_open (void) { mm_segment_t old_fs = get_fs(); #ifdef FEATURE_DEBUG_LOW FELICA_DEBUG_MSG("[FELICA_I2C] felica_i2c_open\n"); #endif set_fs(KERNEL_DS); fd = sys_open(FELICA_IC2_NAME, O_RDWR|O_NONBLOCK, 0); if (fd < 0) { FELICA_DEBUG_MSG("[FELICA_I2C] ERROR - felica_i2c_open : %d \n", fd); return fd; } set_fs(old_fs); return 0; }