file_utils.c

00001 #include <net-snmp/net-snmp-config.h>
00002 #include <net-snmp/net-snmp-includes.h>
00003 
00004 #include <stdio.h>
00005 #include <ctype.h>
00006 #if HAVE_STDLIB_H
00007 #   include <stdlib.h>
00008 #endif
00009 #if HAVE_UNISTD_H
00010 #   include <unistd.h>
00011 #endif
00012 #if HAVE_STRING_H
00013 #   include <string.h>
00014 #else
00015 #  include <strings.h>
00016 #endif
00017 
00018 #include <sys/types.h>
00019 
00020 #if HAVE_SYS_PARAM_H
00021 #   include <sys/param.h>
00022 #endif
00023 #ifdef HAVE_SYS_STAT_H
00024 #   include <sys/stat.h>
00025 #endif
00026 #ifdef HAVE_FCNTL_H
00027 #   include <fcntl.h>
00028 #endif
00029 
00030 #include <errno.h>
00031 
00032 #if HAVE_DMALLOC_H
00033 #  include <dmalloc.h>
00034 #endif
00035 
00036 #include <net-snmp/types.h>
00037 #include <net-snmp/library/container.h>
00038 #include <net-snmp/library/file_utils.h>
00039 
00040 
00041 /*------------------------------------------------------------------
00042  *
00043  * Prototypes
00044  *
00045  */
00046 
00047 
00048 
00049 
00050 /*------------------------------------------------------------------
00051  *
00052  * Core Functions
00053  *
00054  */
00055 
00062 netsnmp_file *
00063 netsnmp_file_create(void)
00064 {
00065     netsnmp_file *filei = SNMP_MALLOC_TYPEDEF(netsnmp_file);
00066 
00067     /*
00068      * 0 is a valid file descriptor, so init to -1
00069      */
00070     if (NULL != filei)
00071         filei->fd = -1;
00072     else {
00073         snmp_log(LOG_WARNING,"failed to malloc netsnmp_file structure\n");
00074     }
00075 
00076     return filei;
00077 }
00078 
00088 netsnmp_file *
00089 netsnmp_file_fill(netsnmp_file * filei, const char* name,
00090                   int fs_flags, mode_t mode, u_int ns_flags)
00091 {
00092     if (NULL == filei) {
00093         filei = netsnmp_file_create();
00094         if (NULL == filei) /* failure already logged */
00095             return NULL;
00096     }
00097 
00098     if (NULL != name)
00099         filei->name = strdup(name);
00100 
00101     filei->fs_flags = fs_flags;
00102     filei->ns_flags = ns_flags;
00103 
00104     return filei;
00105 }
00106 
00112 int
00113 netsnmp_file_release(netsnmp_file * filei)
00114 {
00115     int rc = 0;
00116 
00117     if (NULL == filei)
00118         return -1;
00119 
00120     if ((filei->fd > 0) && NS_FI_AUTOCLOSE(filei->ns_flags))
00121         rc = close(filei->fd);
00122 
00123     if (NULL != filei->name)
00124         free(filei->name); /* no point in SNMP_FREE */
00125 
00126     if (NULL != filei->extras)
00127         netsnmp_free_all_list_data(filei->extras);
00128 
00129     return rc;
00130 }
00131 
00138 int
00139 netsnmp_file_open(netsnmp_file * filei)
00140 {
00141     /*
00142      * basic sanity checks
00143      */
00144     if ((NULL == filei) || (NULL == filei->name))
00145         return -1;
00146 
00147     /*
00148      * if file is already open, just return the fd.
00149      */
00150     if (-1 != filei->fd)
00151         return filei->fd;
00152 
00153     /*
00154      * try to open the file, loging an error if we failed
00155      */
00156     if (0 == filei->mode)
00157         filei->fd = open(filei->name, filei->fs_flags);
00158     else
00159         filei->fd = open(filei->name, filei->fs_flags, filei->mode);
00160 
00161     if (filei->fd < 0) {
00162         snmp_log(LOG_ERR, "error opening %s (%d)\n", filei->name, errno);
00163     }
00164 
00165     /*
00166      * return results
00167      */
00168     return filei->fd;
00169 }
00170 
00171 
00178 int
00179 netsnmp_file_close(netsnmp_file * filei)
00180 {
00181     int rc;
00182 
00183     /*
00184      * basic sanity checks
00185      */
00186     if ((NULL == filei) || (NULL != filei->name))
00187         return -1;
00188 
00189     /*
00190      * make sure it's not already closed
00191      */
00192     if (-1 == filei->fd) {
00193         return 0;
00194     }
00195 
00196     /*
00197      * close the file, logging an error if we failed
00198      */
00199     rc = close(filei->fd);
00200     if (rc < 0) {
00201         snmp_log(LOG_ERR, "error closing %s (%d)\n", filei->name, errno);
00202     }
00203     else
00204         filei->fd = -1;
00205 
00206     return rc;
00207 }
00208 

net-snmpに対してSat Sep 5 13:14:21 2009に生成されました。  doxygen 1.4.7